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

Calendar.get(Calendar.YEAR)返回错误年份的问题求助

问题根源与修复方案

嘿,这个坑我之前也踩过!问题出在你日期格式字符串里的大写YYYY——你应该用小写的yyyy才对。

为什么会出错?

  • yyyy是我们日常使用的公历年(格里高利历年份),完全匹配你的需求。
  • YYYY代表的是周年(Week Year),它的计算逻辑是基于周的:每年的第一周必须至少包含4天。这就会导致部分日期(比如跨年前后的周)的周年和公历年不一致。你的日期是2019年5月11日,按说周年也该是2019,但可能因为JVM时区或Calendar的周计算规则,解析时错误匹配到了2018的周年——不过不管怎样,换成yyyy就能彻底解决这个问题。

修复后的代码

把格式字符串里的YYYY替换成yyyy即可:

class Test{ 
    public static void main(String[] args) { 
        String dateStr = "May 11, 2019 11:35:34 AM"; 
        SimpleDateFormat format = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a"); 
        try{ 
            Date d1 = format.parse(dateStr); 
            Calendar cal = Calendar.getInstance(); 
            cal.setTime(d1); 
            System.out.println(cal.get(Calendar.YEAR)); // 现在会正确输出2019
            // 顺便提一句:你代码里的System.out.println(Calendar.YEAR); 输出的是常量值1,这不是你想要的年份,记得删掉或者修正哦
        }catch (Exception e){ 
            e.printStackTrace(); 
        } 
    } 
}

额外推荐(更优方案)

如果你用的是Java 8及以上版本,真心建议换掉老旧的SimpleDateFormat和Calendar,改用java.time包下的新日期API——它们线程安全,API设计更清晰,不容易踩坑。给你写个示例:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class Test{ 
    public static void main(String[] args) { 
        String dateStr = "May 11, 2019 11:35:34 AM"; 
        // 注意这里用hh(12小时制)对应AM/PM,比HH更规范
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy hh:mm:ss a");
        LocalDateTime dateTime = LocalDateTime.parse(dateStr, formatter);
        System.out.println(dateTime.getYear()); // 稳稳输出2019
    } 
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:45:58