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
相关产品推荐
相关产品推荐

