解析带时区的postgresql时间戳时的日历精度偏差

时间:2014-11-13 17:06:20

标签: java postgresql calendar

我在使用时区转换postgresql 日期时间时发现了一个错误

SimpleDateFormat postgreSQLTimestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSX");

Calendar inst = Calendar.getInstance();
inst.setTime(postgreSQLTimestampFormat.parse("2014-11-13 17:36:41.936208+01"));

logger.info(activationChangeDate + " -> " + inst.getTimeInMillis());

根据https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html格式应该是正确的,但输出是:

  

2014-11-13 17:36:41.936208 + 01 - > 1415897537208

并在GMT + 1中转换时间戳1415897537(截断3毫位数)

  

2014-11-13T17:52:17 + 01:00

有7分钟的偏差,并且不知道为什么。

转换回另一种格式也无济于事:

SimpleDateFormat outFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm.ss");
logger.info(outFormat.format(inst.getTimeInMillis()));

反映了偏差:

  

13/11/2014 17:52.17

=== 编辑 做更多测试似乎SimpleDateFormat(或我所知道的Calendar)无法处理微秒:

    SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSX");
    SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSX");
    SimpleDateFormat format3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssX");

    try {
        Calendar inst = Calendar.getInstance();
        inst.setTime(format1.parse("2014-11-13 17:36:41.936208+01"));
        System.out.println(inst.getTimeInMillis()); 
        // 1415897537208 -> 2014-11-13T17:52:17+01:00 [wrong]
        inst.setTime(format2.parse("2014-11-13 17:36:41.936+01"));
        System.out.println(inst.getTimeInMillis()); 
        // 1415896601936 -> 2014-11-13T17:36:41+01:00 [good]
        inst.setTime(format3.parse("2014-11-13 17:36:41+01")); 
        System.out.println(inst.getTimeInMillis()); 
        // 1415896601000 -> 2014-11-13T17:36:41+01:00 [good]
    } catch (ParseException e) {}

寻找克服这一点的建议。

0 个答案:

没有答案