简短的回答
Java 现在读取得更早,在 surefire 设置 中的属性之前。解决方案是使用以下命令将其设置得更早:user.timezone
systemPropertyVariables
argLine
<plugin>
...
<configuration>
<argLine>-Duser.timezone=UTC</argLine>
长答案
Java 初始化默认时区,考虑它第一次需要它的时间,然后将其缓存在 中。现在,在读取 jar 文件时已经发生了这种情况:现在调用会创建一个初始化默认时区的实例。这不是一个特定于肯定的问题。有人称它为JDK7中的一个错误。此程序以前以 UTC 格式打印时间,但现在使用系统时区:user.timezone
java.util.TimeZone
ZipFile.getZipEntry
ZipUtils.dosToJavaTime
Date
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"));
完整示例:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
... could specify version, other settings if desired ...
<configuration>
<argLine>-Duser.timezone=UTC</argLine>
</configuration>
</plugin>
</plugins>
</build>