在Java 8上为mavenunit testing设置时区

如何在Java 8上的maven surefire中设置unit testing的时区?

对于Java 7,这曾经使用systemPropertyVariables就像在以下配置中一样,但是对于Java 8,测试只使用系统时区。

  org.apache.maven.plugins maven-surefire-plugin   UTC  

为什么会这样,我该如何解决?

简短的回答

user.timezone设置user.timezone的属性之前,Java现在更早地读取user.timezone 。 解决方案是使用argLine更早地设置它:

  ...  -Duser.timezone=UTC 

答案很长

Java初始化默认时区,在一次需要时将user.timezone考虑在内,然后将其缓存在java.util.TimeZone 。 现在,在读取jar文件时已经发生了这种情况: ZipFile.getZipEntry现在调用ZipUtils.dosToJavaTime ,它创建一个初始化默认时区的Date实例。 这不是一个特定的问题。 此程序用于以UTC格式打印时间,但现在使用系统时区:

 import java.util.*; class TimeZoneTest { public static void main(String[] args) { System.setProperty("user.timezone", "UTC"); System.out.println(new Date()); } } 

通常,解决方案是在命令行上指定时区,如java -Duser.timezone=UTC TimeZoneTest ,或者使用TimeZone.setDefault(TimeZone.getTimeZone("UTC"));以编程方式设置TimeZone.setDefault(TimeZone.getTimeZone("UTC"));