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

