2013-02-20 159 views
2

我们有一个使用的-Duser.timezone参数在启动一个Java PROGRAMM:Java的时区和夏令冬季

-Duser.timezone =“CET”

这是因为neccessary我们不能依靠在服务器内部时钟(管理员玩耍,设置错误时区等,不要:-(问),它是重要的是前端的时区的后端相匹配。

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

感谢和问候, 亚历

编辑:是java的决定与ervery调用正确的时区到使用日期的功能,这是可能的。但java也可能在启动时确定一次正确的时区。

回答

2

Java中的时间仅仅是一个简单的长值(自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 
+0

非常感谢您的详细解答和解决我的问题。 – AlexWerz 2013-02-20 14:07:29

0

我敢肯定设置user.timezone设置缺省的时区就像TimeZone.setDefault()。因此,它不会针对夏令时或其他更改进行更新。

如果你真的要做到这一点,我的建议是创建一个自定义的请求到服务器,可以通过调用TimeZone.setDefault()更改时区。这样,您可以在需要时更改它,而无需重新启动服务器。显然,这个请求需要被保护,以便只有管理员才能执行它。