我在使用时区转换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) {}
寻找克服这一点的建议。