强制 Java 时区为 GMT/UTC

2022-08-31 09:25:15

我需要强制任何与时间相关的操作都设置为 GMT/UTC,而不考虑计算机上设置的时区。在代码中有什么方便的方法吗?

为了澄清,我使用数据库服务器时间进行所有操作,但它是根据本地时区格式化的。

谢谢!


答案 1

OP 回答了这个问题,以更改正在运行的 JVM 的单个实例的默认时区,设置系统属性:user.timezone

java -Duser.timezone=GMT ... <main-class>

如果在从数据库中检索日期/时间/时间戳对象时需要设置特定的时区,请使用采用对象的第二种形式的方法:ResultSetgetXXXCalendar

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.Datejava.sql.DateSimpleDateFormat

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


答案 2

另外,如果您可以以这种方式设置JVM时区

System.setProperty("user.timezone", "EST");

或在 JVM 参数中。-Duser.timezone=GMT


推荐