0

我正在尝试使用 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

4

2 回答 2

6

这完全与时区有关。

您已将其设置为UTC午夜,并将其格式化为日期 - 但实际上是柏林时间凌晨 2 点。

然后,您将解析该日期,该日期将解析为Berlin 的该日期的午夜,这比您的起点早两个小时。如果您想再次恢复午夜 UTC,只需将您的时区设置SimpleDateFormat为 UTC 时区。

于 2012-05-08T19:35:21.993 回答
1

代码没有问题,只是输入假设。

649555200000L 是 1990 年 8 月 2 日柏林的凌晨 2 点。实际结果是柏林午夜的正确值,当您将仅日期的字符串模式解析为 java.util.Date 时,java 会给您这个值。

于 2012-05-08T19:37:02.863 回答