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

当我运行此代码时:

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在从Eclipse启动时从Maven和GMT+01:00启动时使用CEST

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

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

 -Duser.timezone= 

…或通过编程方式设置:

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

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

 DateFormat myDateFormat = new SimpleDateFormat(""); myDateFormat.setTimeZone(TimeZone.getTimeZone("")); .... System.out.println(myDateFormat.format(yourDate)); 

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

不要忘记Date.toString()使用默认时区。 我个人更喜欢使用Joda Time并且可能记录UTC值而不是当地时间:)

加:

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

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

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

在Maven中,您可以使用MAVEN_OPTS环境变量。 此处还有一篇文章介绍了如何在Windows上永久更改语言环境。