Java 时区和夏令时 - 冬令时

标签 java timezone

我们有一个在启动时使用 -Duser.timezone 参数的 java 程序:

-Duser.timezone="CET"

这是必要的,因为我们不能依赖服务器内部时钟(管理员玩游戏,设置错误的时区等等,不要问 :-( ) 前端的时区与后端匹配很重要.

由于这个程序没有定期重启(它是一个服务器)我想知道当我们从冬季切换到夏季时会发生什么?它会自动切换还是我们必须重新启动服务器?

感谢和问候, 亚历克斯

编辑:Java 可能会通过每次调用使用日期的函数来确定正确的时区。但也有可能是 java 在启动时确定了正确的时区。

最佳答案

Java 中的时间只是一个简单的 long 值(自 1970 年以来的毫秒数),没有任何关于时区的信息。 java.util.Datejava.sql.Date 也将日期/时间内部存储为自 1970 年以来的毫秒数,但使用 UTC 时区。

当您为输出设置日期/时间格式或从字符串解析日期/时间时,时区就会发挥作用。届时将使用您通过 -Duser.timezone 设置的时区信息。

所以它应该可以工作,一个小测试也显示了它:

public static void main(String[] args) {
    Calendar c = Calendar.getInstance();
    c.set(2013, 2, 30, 23, 0, 0);
    long start = c.getTimeInMillis();
    long oneHour = 1000 * 60 * 60;
    long t = start;
    for (long i = 0; i < 5; i++) {
        System.out.println(new Date(t));            
        t = t + oneHour;
    }
}

使用 -Duser.timezone=GMT 它将打印:(无开关)

Sat Mar 30 23:00:00 GMT 2013
Sun Mar 31 00:00:00 GMT 2013
Sun Mar 31 01:00:00 GMT 2013
Sun Mar 31 02:00:00 GMT 2013
Sun Mar 31 03:00:00 GMT 2013

使用 -Duser.timezone=CET 它将打印:(凌晨 2 点切换)

Sat Mar 30 23:00:00 CET 2013
Sun Mar 31 00:00:00 CET 2013
Sun Mar 31 01:00:00 CET 2013
Sun Mar 31 03:00:00 CEST 2013
Sun Mar 31 04:00:00 CEST 2013

使用 -Duser.timezone=EET 它将打印:(东欧时间,CET 后一小时)

Sat Mar 30 23:00:00 EET 2013
Sun Mar 31 00:00:00 EET 2013
Sun Mar 31 01:00:00 EET 2013
Sun Mar 31 02:00:00 EET 2013
Sun Mar 31 04:00:00 EEST 2013

关于Java 时区和夏令时 - 冬令时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14979310/

相关文章:

Python:如何检查日期是否不明确?

javascript - 瞬间时区 : UTC offset difference

java - 泛型继承

java - gwt 2.7 忽略排除标签

java - Docker 容器中使用 Selenium 和 Java 的 Headless chrome

vbscript - 使用 VBScript 确定我的时区偏移量?

python - pytz - 将 UTC 和时区转换为本地时间

javascript - MomentJS 在服务器上以不同方式比较日期

java.lang.OutOfMemory错误: GC overhead limit exceeded JAVA

java - 如何验证 JSoup 选择字符串