为何Kotlin的println方法无法正确打印java.sql.Timestamp?
为何
java.sql.Timestamp直接打印与SimpleDateFormat格式化结果差异巨大? 测试代码
val df = java.text.SimpleDateFormat("d MMM yyyy G, HH:mm:ss.S Z") println(df.format(java.sql.Timestamp(Long.MIN_VALUE))) println(java.sql.Timestamp(Long.MIN_VALUE))
输出结果
2 Dec 292269055 BC, 17:47:04.192 +0100 292278994-08-17 08:12:55.192
问题
使用SimpleDateFormat得到的输出为正确结果,除毫秒外其余日期部分均存在差异。请问为何必须借助SimpleDateFormat才能获取正确结果?背后原因是什么?
原因解析
1. java.sql.Timestamp.toString()的硬编码局限
Timestamp的toString()方法存在两个核心缺陷:
- 完全忽略儒略历与格里高利历的历史转换规则,对于
Long.MIN_VALUE这类极端早的公元前日期,直接套用格里高利历计算逻辑,导致日期出现八千多年的巨大偏差。 - 输出格式固定为
yyyy-MM-dd HH:mm:ss.SSS,既不处理时区偏移,也不标注历法(BC/AD),无法准确表示远古日期。
2. SimpleDateFormat依赖Calendar的正确历法处理
SimpleDateFormat格式化时依托Calendar类完成日期解析:
Calendar会根据年份自动切换历法:公元前日期使用儒略历(符合当时历史历法使用情况),公元后日期则按年份判断是否切换为格里高利历。- 支持自定义格式,能正确输出时区偏移和历法标识,最终得到符合预期的正确日期字符串。
内容的提问来源于stack exchange,提问作者H.B.
相关产品推荐
相关产品推荐

