我正在实现格式化数据库中插入的时间戳的功能。
现有解决方案使用SimpleDateFormat
执行此任务。
由于SimpleDateFormat
不是线程安全的,我将实现转换为使用java.time。
在这个过程中,我遇到了一些奇怪的行为,其中格式化会产生不同的结果。
以下示例显示了在使用Timestamp
时使用"1500-01-10 00:12:12"
和java.time
时1500-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跳过使用这些数据但到目前为止没有成功。
答案 0 :(得分:0)
您可以使用线程安全的FastDateFormat而不是SimpleDateFormat。