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

Java中java.util.Date年末日期转字符串出现年份错误求助

问题分析与解决方案

你遇到的这个日期格式化错误,根源在于**YYYY和yyyy的语义差异**:

  • yyyy:代表普通的公历年(Calendar Year),也就是我们日常使用的年份。
  • YYYY:代表周年(Week Year),它是基于ISO周历规则计算的年份——一周从周一开始,且一年的第一周必须包含至少4天在当年。

2017年12月31日是周日,按照ISO周历规则,这一天属于2018年的第一周(因为2018年1月1日是周一,该周包含2017年12月31日和2018年的前4天),所以用YYYY格式化时就会错误地得到2018。

修正后的代码

只需要把格式化模式中的YYYY替换成yyyy即可:

String dateSt = "Sun Dec 31 10:30:00 IST 2017";
DateFormat formatter = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
Date date = formatter.parse(dateSt);
DateFormat ft= new SimpleDateFormat("yyyyMMdd"); // 这里把YYYY改成yyyy
String dateStr = ft.format(date);
System.out.println("New Date =="+dateStr);

运行这段代码后,输出就会是预期的20171231。

额外建议:使用Java 8+的新日期API

SimpleDateFormat是线程不安全的,而且旧的Date/CalendarAPI设计存在诸多缺陷。推荐使用Java 8引入的java.time包下的API,示例代码如下:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class DateDemo {
    public static void main(String[] args) {
        String dateSt = "Sun Dec 31 10:30:00 IST 2017";
        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("E MMM dd HH:mm:ss z uuuu");
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateSt, inputFormatter);
        
        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("uuuuMMdd");
        String dateStr = outputFormatter.format(zonedDateTime);
        System.out.println("New Date =="+dateStr);
    }
}

这里用uuuu代替yyyy(语义一致,但更符合新API的规范),z代表时区标识,ZonedDateTime可以正确处理带时区的日期时间,而且新API是线程安全的,使用起来更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:36:36