问题 新日期(长)给出不同的结果


当我运行此代码时:

System.out.println( "XXX date=" + new Date( 1311781583373L ) );

我在Eclipse的JUnit运行器中得到了这个结果:

XXX date=Wed Jul 27 16:46:23 GMT+01:00 2011

这从命令行导致Maven:

XXX date=Wed Jul 27 17:46:23 CEST 2011

如你所见,时间不同。

(相同的计算机,相同的Java版本,可能相差30秒)。为什么?

[编辑] 时区也不同。为什么Java使用 CEST 当它从Maven和 GMT+01:00 从Eclipse开始?

或者换一种说法:我如何强迫Java使用?


9793
2017-08-08 12:11


起源



答案:


要指定默认时区,您可以设置系统属性 user.timezone。您可以将它作为参数传递给JavaVM(您可能需要修改eclipse.ini或Maven等效配置文件):

-Duser.timezone=<your preferred timezone>

...或通过编程方式设置:

 System.setProperty("user.timezone", "<your preferred timezone>");

或者,如果方便,您可以指定每次打印日期时使用的时区:

DateFormat myDateFormat = new SimpleDateFormat("<insert date format string here>");    
myDateFormat.setTimeZone(TimeZone.getTimeZone("<your preferred timezone>")); 
....
System.out.println(myDateFormat.format(yourDate));

5
2017-08-08 12:38



为了记录:Java 6比Java 5更明智地计算出时区。我让Maven使用Java 6 .mavenrc - Aaron Digulla


答案:


要指定默认时区,您可以设置系统属性 user.timezone。您可以将它作为参数传递给JavaVM(您可能需要修改eclipse.ini或Maven等效配置文件):

-Duser.timezone=<your preferred timezone>

...或通过编程方式设置:

 System.setProperty("user.timezone", "<your preferred timezone>");

或者,如果方便,您可以指定每次打印日期时使用的时区:

DateFormat myDateFormat = new SimpleDateFormat("<insert date format string here>");    
myDateFormat.setTimeZone(TimeZone.getTimeZone("<your preferred timezone>")); 
....
System.out.println(myDateFormat.format(yourDate));

5
2017-08-08 12:38



为了记录:Java 6比Java 5更明智地计算出时区。我让Maven使用Java 6 .mavenrc - Aaron Digulla


看起来Maven和Eclipse已经选择了不同的默认时区,就是这样。

别忘了 Date.toString() 使用默认时区。我个人更喜欢使用 乔达时间 并且可能记录UTC值而不是本地时间:)


6
2017-08-08 12:13



Java如何确定默认时区?我不知道我给了Eclipse不同的Java时区设置而不是Maven。 - Aaron Digulla
正如您在输出中看到的那样,时区信息是不同的。我该如何解决这个问题?传统代码,所以Joda Time不是一个选择。 - Aaron Digulla
@Aaron:通过在环境中指定二进制文件,可以强制Eclipse在启动二进制文件时使用特定时区。您可以使用Eclipse执行相同的操作,但不清楚哪种情况在您的情况下是“正确的”,或者确实为什么它们不同。 - Jon Skeet


加:

System.out.println(TimeZone.getDefault().getDisplayName());

在计算日期之前。它应该显示不同的时区。默认时区基于JVM使用的语言环境。您可以通过向JVM提供以下参数来强制JVM使用您首选的区域设置:

$ java -Duser.language=fr -Duser.country=CA

在Maven你可以使用 MAVEN_OPTS 环境变量。也 这里 是一篇描述如何在Windows上永久更改语言环境的文章。


3
2017-08-08 12:20



运行Java时的值 user.timezone 是不同的。在Eclipse中,它是 US。在Maven,它是 Europe/Zurich。 user.country 总是 US。 - Aaron Digulla