我正在尝试使用SimpleDateFormat在unix时间戳和自定义格式之间进行转换,反之亦然。为了测试这种反之亦然的转换,我编写了以下测试用例:
public class Testception extends TestCase {
public void testTheTestOrTestception() throws ParseException {
Date datum = new Date(649555200000L);
SimpleDateFormat dfm = new SimpleDateFormat("yyyy-MM-dd");
TimeZone tZ = TimeZone.getTimeZone("Europe/Berlin");
dfm.setTimeZone(tZ);
String aDifferentFormat = dfm.format(datum);
assertEquals("1990-08-02", aDifferentFormat);
Date datum2 = dfm.parse(aDifferentFormat);
assertEquals(649555200000L, datum2.getTime());
}
}
我从一个 unixtimestamp (649555200000) 开始,将其转换为我的自定义格式("1990-08-02"),效果很好。但不幸的是,第二个断言失败,而不是预期的 649555200000L,结果是 649548000000L
提前谢谢。
干杯L0rdAli3n
这一切都与时区有关。
你给了它午夜UTC,并将其格式化为日期 - 但它实际上是柏林时间凌晨2点。
然后,您正在解析该日期,该日期将解析为柏林该日期的午夜,这比您的起点早两个小时。如果您想再次恢复午夜 UTC,只需将SimpleDateFormat
的时区设置为 UTC 时区即可。
代码没有任何问题,只是输入假设。
649555200000L是1990年8月2日凌晨2点,柏林。 实际结果是柏林午夜的正确值,当您将仅日期字符串模式解析为 java.util.Date 时,Java 会为您提供该值。