使用DateTimeFormatter为“早期”日期格式化时间戳

时间:2017-10-06 13:36:22

标签: java datetime calendar timestamp java-time

我正在实现格式化数据库中插入的时间戳的功能。 现有解决方案使用SimpleDateFormat执行此任务。
由于SimpleDateFormat不是线程安全的,我将实现转换为使用java.time。

在这个过程中,我遇到了一些奇怪的行为,其中格式化会产生不同的结果。 以下示例显示了在使用Timestamp时使用"1500-01-10 00:12:12"java.time1500-01-01 00:00:00的格式为SimpleDateFormat
我不能理解为什么我们在使用java.time时休假9天。 12:12来自何处。
使用'1500-01-01 00:00:00'将数据插入数据库。
使用数据库格式化函数DATE_FORMAT呈现 预期产出。

public static void main(String[] args) {
   // The following ts value is obtained by debugging the Timestamp
   // instance when reading data from MYSQL. 
   long ts = -14830995600000l;
   String TSPATTERN = "yyyy-MM-dd HH:mm:ss";
   Timestamp timestamp = new Timestamp(ts);
   System.out.println("                            ZoneId: " + ZoneId.systemDefault());
   System.out.println("timestamp.toString() " + timestamp);

   // java.time
   DateTimeFormatter f = DateTimeFormatter.ofPattern(TSPATTERN).withZone(ZoneId.systemDefault());
   String withJavaTime = f.format(timestamp.toInstant());

   // Using SimpleDate format
   SimpleDateFormat fdf = (SimpleDateFormat) SimpleDateFormat.getDateInstance();
   fdf.applyPattern(TSPATTERN);
   String withSDF = fdf.format(ts);
   System.out.println("       With java.time: " + withJavaTime);
   System.out.println("With SimpleDateFormat: " + withSDF);

   // Running the above will print the following output
   // Where does the 12:12 come from? and the 9 days?
   // With java.time: 1500-01-10 00:12:12
   // With SimpleDateFormat: 1500-01-01 00:00:00
}

在比较数据库函数DATE_FORMAT和JSR 310的输出时,我也可以看到分歧。可以解释一下 数据库没有像在JSR 310中那样考虑ZoneOffsetTransition吗?

格式化对应于“1899-12-31 01:00:00”的时间戳,使用JSR 310给出“1899-12-31 01:00:14”。 列出我的ZoneOffsetTransition(ZoneId Europe / Stockholm)给出了以下(不完整列表),可以解释 14分钟。   过渡[重叠在1879-01-01T00:00 + 01:12:12到+01:00:14]   过渡[重叠于1900-01-01T00:00 + 01:00:14至+01:00]

我试图找到一种格式化时间戳的方法,告诉JSR 310跳过使用这些数据但到目前为止没有成功。

1 个答案:

答案 0 :(得分:0)

您可以使用线程安全的FastDateFormat而不是SimpleDateFormat。