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

GregorianCalendar调用异常:获取FEBRUARY返回年份值求助

问题原因分析与解决办法

哦,这个坑我刚学Java的时候也踩过!问题出在你搞混了Calendar类里的两种常量——字段标识符和字段取值,完全不是一回事儿~

核心错误点

Calendar.JANUARY、Calendar.FEBRUARY这些是月份的取值常量(比如JANUARY=0,FEBRUARY=1,以此类推,Calendar的月份是从0开始计数的),而Calendar.get()方法需要传入的是字段标识符,比如Calendar.MONTH(用来告诉方法“我要获取月份这个字段的值”)、Calendar.YEAR(获取年份)。

你的代码为啥会返回奇怪的结果?

咱们拆解下:

  • 当你调用cal1.get(Calendar.JANUARY)时,Calendar.JANUARY的值是0,而Calendar类里ZONE_OFFSET(时区偏移量)的字段ID正好是0,所以你拿到的其实是时区偏移的数值(你说返回1,应该是对应你当前时区的偏移值);
  • 当你调用cal1.get(Calendar.FEBRUARY)时,Calendar.FEBRUARY的值是1,而Calendar.YEAR的字段ID正好是1,所以这行代码其实等价于cal1.get(Calendar.YEAR),自然返回了年份2018!

正确的写法

要获取月份,应该传入Calendar.MONTH这个字段标识符,之后如果要判断是不是某个月份,再和JANUARY这类取值常量对比:

Calendar cal1 = new GregorianCalendar();
// 获取当前月份(返回0-11,对应1月到12月)
int currentMonth = cal1.get(Calendar.MONTH);
// 如果要转成日常的1-12月份,记得加1
int humanReadableMonth = currentMonth + 1;

// 判断当前是否是2月
if (currentMonth == Calendar.FEBRUARY) {
    // 执行对应逻辑
}

// 获取年份的写法是对的
int year = cal1.get(Calendar.YEAR);

小提醒

Calendar的月份是0-based(从0开始)这个设计特别容易踩坑,所以日常使用的时候一定要注意转换,比如给用户展示的时候记得加1哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:08:12