【发布时间】:2021-11-05 07:55:13
【问题描述】:
我有一个函数可以将 Unix 纪元时间解析为 yyyy-MM-dd'T'HH:mm:ss.SSSXXX 这样的格式,以便将其导出到文件中:
public static final SimpleDateFormat REQIF_DATE_FORMAT_WITH_MILLIS
= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
public static String convertEpochStringToReqifDateString(String epochString) {
Date timestamp = new Date(Long.parseLong(epochString));
return REQIF_DATE_FORMAT_WITH_MILLIS.format(timestamp);
}
现在,我对此导出进行了测试,但是当它们在本地通过时,它们在服务器上失败了,因为它显然位于不同的时区。具体来说,差异如下所示:
LAST-CHANGE="2017-03-13T21:36:44.261+01:00"
LAST-CHANGE="2017-03-13T20:36:44.261Z"
为了确保测试始终在同一时区运行,我已经尝试过在测试前运行一些东西,例如:
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
System.setProperty("user.timezone", "UTC");
还有JUnitPioneer注解:
@DefaultTimeZone("UTC")
...但是,它们似乎都不会影响解析输出。
对此我能做些什么?我想要的只是某种方法来确保我的测试在同一时区运行,而不管它们运行的机器站在哪里,这样我就可以正确地测试导出。
【问题讨论】:
-
是否有充分的理由使用
Date,而不是java.time.Instant(它有自己的toString()方法,并且总是在祖鲁语中打印? -
(顺便说一句,我希望您只是省略代码以确保一次只有一个线程访问 SimpleDateFormat?如果没有,您需要确保,例如使用
ThreadLocal代替。你不需要使用Instant) -
我建议你不要使用
SimpleDateFormat和Date。这些类设计不良且过时,尤其是前者,尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time API 的Instant。 -
不要确保测试在特定时区运行。编写代码和测试,使它们独立于 JVM 的默认时区。
标签: java unit-testing timezone datetime-format epoch