我们有一个在启动时使用 -Duser.timezone 参数的 java 程序:
-Duser.timezone="CET"
这是必要的,因为我们不能依赖服务器内部时钟(管理员玩游戏,设置错误的时区等等,不要问 :-( ) 前端的时区与后端匹配很重要.
由于这个程序没有定期重启(它是一个服务器)我想知道当我们从冬季切换到夏季时会发生什么?它会自动切换还是我们必须重新启动服务器?
感谢和问候, 亚历克斯
编辑:Java 可能会通过每次调用使用日期的函数来确定正确的时区。但也有可能是 java 在启动时确定了正确的时区。
最佳答案
Java 中的时间只是一个简单的 long 值(自 1970 年以来的毫秒数),没有任何关于时区的信息。 java.util.Date
和 java.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/