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

如何让DateTimeFormatter输出Y10K+日期与SimpleDateFormat结果一致

DateTimeFormatter 正年份无加号适配方案

问题本质

默认DateTimeFormatter.ofPattern("yyyy")使用SignStyle.EXCEEDS_PAD符号规则:当年份位数超过模式定义的4位宽度时,会自动给大于9999的正年份添加前缀+,与SimpleDateFormat的yyyy输出行为不一致。

适配方案

通过DateTimeFormatterBuilder手动指定年份的符号规则为SignStyle.NORMAL(仅负年份显示符号,正年份无论位数多少都不显示符号),即可完全对齐SimpleDateFormat的输出效果。

示例代码

// 构造符合要求的格式化器
DateTimeFormatter compatibleFormatter = new DateTimeFormatterBuilder()
        .appendPattern("dd-MM-")
        // 年份配置:最小填充4位,最大支持10位年份(可按需调整最大值),仅负数显示符号
        .appendValue(ChronoField.YEAR, 4, 10, SignStyle.NORMAL)
        .toFormatter();

// 测试验证:10000年场景断言通过
LocalDate localDate = LocalDate.of(10000, 1, 1);
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.set(10000, 0, 1, 12, 0 , 0);

Assertions.assertEquals(
    new SimpleDateFormat("dd-MM-yyyy").format(cal.getTime()),
    localDate.format(compatibleFormatter)
);

规则说明

  • 若需要支持更长的年份,调整appendValue方法的第三个参数(最大宽度)即可,例如要支持最高8位年份则改为8。
  • 该配置同时兼容负年份输出:负年份会自动添加-前缀,与SimpleDateFormat行为完全一致。

内容的提问来源于stack exchange,提问作者Philzen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:57:03