解析后SimpleDateFormat错误的unix时间戳

时间:2012-05-08 19:30:07

标签: java date timezone simpledateformat

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

2 个答案:

答案 0 :(得分:6)

这与时区有关。

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

然后你解析那个 date ,它将解析那天在柏林的午夜,比你的起点早两个小时。如果您想再次返回午夜UTC,只需将SimpleDateFormat的时区设置为UTC时区。

答案 1 :(得分:1)

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

649555200000L是1990年8月2日早上2点在柏林。实际结果是柏林午夜的正确值,这是java在将日期字符串模式解析为java.util时会给你的。日期。