强制 Java 时区为 GMT/UTC
我需要强制任何与时间相关的操作都设置为 GMT/UTC,而不考虑计算机上设置的时区。在代码中有什么方便的方法吗?
为了澄清,我使用数据库服务器时间进行所有操作,但它是根据本地时区格式化的。
谢谢!
我需要强制任何与时间相关的操作都设置为 GMT/UTC,而不考虑计算机上设置的时区。在代码中有什么方便的方法吗?
为了澄清,我使用数据库服务器时间进行所有操作,但它是根据本地时区格式化的。
谢谢!
OP 回答了这个问题,以更改正在运行的 JVM 的单个实例的默认时区,设置系统属性:user.timezone
java -Duser.timezone=GMT ... <main-class>
如果在从数据库中检索日期/时间/时间戳对象时需要设置特定的时区,请使用采用对象的第二种形式的方法:ResultSet
getXXX
Calendar
Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
ResultSet rs = ...;
while (rs.next()) {
Date dateValue = rs.getDate("DateColumn", tzCal);
// Other fields and calculations
}
或者,在预准备语句中设置日期:
Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
PreparedStatement ps = conn.createPreparedStatement("update ...");
ps.setDate("DateColumn", dateValue, tzCal);
// Other assignments
ps.executeUpdate();
这将确保当数据库列不保留时区信息时,存储在数据库中的值是一致的。
和 类以 UTC 格式存储实际时间(毫秒)。要在输出到其他时区时设置这些格式,请使用 。您还可以使用 Calendar 对象将时区与值相关联:java.util.Date
java.sql.Date
SimpleDateFormat
TimeZone tz = TimeZone.getTimeZone("<local-time-zone>");
//...
Date dateValue = rs.getDate("DateColumn");
Calendar calValue = Calendar.getInstance(tz);
calValue.setTime(dateValue);
有用参考
https://docs.oracle.com/javase/9/troubleshoot/time-zone-settings-jre.htm#JSTGD377
https://confluence.atlassian.com/kb/setting-the-timezone-for-the-java-environment-841187402.html
另外,如果您可以以这种方式设置JVM时区
System.setProperty("user.timezone", "EST");
或在 JVM 参数中。-Duser.timezone=GMT