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

SimpleDateFormat格式化日期时2018变2019的原因咨询

问题根源与解决办法

嘿,这个坑我之前也踩过!你的问题核心就在于日期格式符的选择:你用了大写的YYYY,但实际上应该用小写的yyyy。

为啥会变成2019?

  • YYYY代表的是周年(Week Year),它是按周来划分年份的。按照ISO周历规则,每周从周一开始,而且如果某一年的最后几天所在的周,有至少4天落在下一年,那这几天就会被归到下一年的第一周。
  • 2018年12月31日刚好就是这种情况:它属于2019年的第一周,所以用YYYY格式化时,年份就变成了2019。
  • 而小写的yyyy才是我们日常说的公历年,它会直接对应日期所属的公历年份,不会受周的影响。

修正后的代码

把格式字符串改成"dd/MM/yyyy"就行,要是需要指定法语区域也可以加上,效果就正常了:

LOG.info("date de création :" + entite.getCreatedt());
// 正确的格式符是yyyy,不是YYYY
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", Locale.FRANCE);
LOG.info("date de création formatée :" + sdf.format(entite.getCreatedt()));

额外推荐:换用Java 8+的新日期API

SimpleDateFormat有个大问题——它不是线程安全的,在多线程场景下很容易出bug。推荐你用Java 8开始引入的java.time系列API,比如DateTimeFormatter,不仅安全,用法也更清晰:

// 先把旧的Date转成LocalDate(因为你的字段是DATE类型,只需要日期部分)
LocalDate createdDate = entite.getCreatedt().toInstant()
    .atZone(ZoneId.systemDefault())
    .toLocalDate();
// 创建格式化器,指定模式和法语区域
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy", Locale.FRANCE);
LOG.info("date de création formatée :" + formatter.format(createdDate));

这样改完之后,日期格式化就不会再出这种奇怪的问题啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:43:15