You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:12:51