问题代码如下

public static Date monthLastDate(Integer year, Integer month) throws ParseException {if (year == null || month == null || month > 12 || month < 1) {return null;}Calendar calendar = Calendar.getInstance();calendar.set(Calendar.YEAR, year);calendar.set(Calendar.MONTH, month - 1);int i = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));return calendar.getTime();}

无论方法传入的month为何值,i值总是当前月份的最大值。

因为Calendar类在初始化时系统时间时已经设置了Calendar.DAY_OF_MONTH的最大值,当我们修改了年份和月份的值,Calendar并没有同时去修改设置对应字段的ActualMaximum的值。

方法 说明
void clear() 此方法设置此日历的所有日历字段值和时间值(毫秒从历元至偏移量)未定义。
int getActualMaximum(int field) 此方法返回指定日历字段可能拥有的最大值,鉴于此日历时间值。

解决办法:

如果要修改创建的calendar的值,首先先清空calendar所有初始的默认值,然后在修改值。
可以理解为使用clear()方法清除calendar的缓存。

public static Date monthLastDate(Integer year, Integer month) throws ParseException {if (year == null || month == null || month > 12 || month < 1) {return null;}Calendar calendar = Calendar.getInstance();calendar.clear();calendar.set(Calendar.YEAR, year);calendar.set(Calendar.MONTH, month - 1);int i = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));return calendar.getTime();}

问题探究

我们看一下他的set方法,当我们set字段A的值时,并不会把所有跟A相关的值同时修改掉,只是设置了一个状态,表时其他字段还没有设置。

 public void set(int field, int value){// If the fields are partially normalized, calculate all the// fields before changing any fields.if (areFieldsSet && !areAllFieldsSet) {computeFields();}internalSet(field, value);isTimeSet = false;areFieldsSet = false;isSet[field] = true;stamp[field] = nextStamp++;if (nextStamp == Integer.MAX_VALUE) {adjustStamp();}}

当我们get某个字段B的值时,会调用计算所有字段的方法,计算完毕后再去取这个字段B的值。


public int get(int field){complete();return internalGet(field);}

下面计算所有字段的方法

/*** Fills in any unset fields in the calendar fields. First, the {@link* #computeTime()} method is called if the time value (millisecond offset* from the <a href="#Epoch">Epoch</a>) has not been calculated from* calendar field values. Then, the {@link #computeFields()} method is* called to calculate all calendar field values.*/protected void complete(){if (!isTimeSet) {updateTime();}if (!areFieldsSet || !areAllFieldsSet) {computeFields(); // fills in unset fieldsareAllFieldsSet = areFieldsSet = true;}}```

calendar.getActualMaximum(calendar.DAY_OF_MONTH)的坑点相关推荐

  1. Java Calendar getActualMaximum()方法与示例

    日历类的getActualMaximum()方法 (Calendar Class getActualMaximum() method) getActualMaximum() method is ava ...

  2. java day of month_Java Calendar实例增加DAY_OF_MONTH作为递减(仅)HOUR或MINUTE的副作用

    我有一个带有TimePicker(@ id / tyme)的主活动的an unfinished Android app,一个DatePicker(@id / date)和一个TextView(@ id ...

  3. java calendar getactualmaximum_Java Calendar

    1 什么是Calendar? Calendar(读音:[ˈkælɪndə(r)] )是java util包下的一个工具类,提供了不同日期格式的处理. Calendar是一个抽象类,不能用构造器来创建, ...

  4. java calendar field_Java Calendar详解

    一:字段和方法的信息 YEAR 字段: public static final int YEAR ; 指示年的 get 和 set 的字段数字.这是一个特定于日历的值: get 方法: public ...

  5. 【Calendar】Calendar设置月份为本月最后一天

    1.例如: 现在是2017年6月19日:我想设置时间为6月最后一天: 2.思路: 因为要考虑到每个月最后一天是28,29,30,还是31号所以正常思维来做很麻烦:这里我们换一种思路: 找到上个月的第一 ...

  6. LeetCode#732 My Calendar My Calendar III

    LeetCode#732 My Calendar My Calendar III 题目 Implement a MyCalendarThree class to store your events. ...

  7. java calendar compareto_Java Calendar compareTo()用法及代码示例

    Calendar类的add(Calendar Calendar2)方法用于将此Calendar对象的时间值或毫秒偏移与传递的Calendar对象进行比较. 用法: public int compare ...

  8. Calendar类 Calendar.HOUR(12小时制) 和 Calendar.HOUR_OF_DAY(24小时制)

    今天发现调度器设置成上午的时间执行,下午的时间不执行. 查看代码发现: Calendar.HOUR_OF_DAY (24小时)设置成 <span style="font-family: ...

  9. Java中Calendar.DAY_OF_WEEK、DAY_OF_MONTH需要减一的原因

    Java中对日期的处理需要用到Calendar类,其中有几个方法在使用时需要新手注意. 1. 在获取月份时,Calendar.MONTH + 1 的原因(Java中Calendar.MONTH返回的数 ...

最新文章

  1. AUTOML 和 NAS 的真谛
  2. 看固态存储厂商在硝烟四起的市场中如何发展?
  3. numpy笔记:random.permutation
  4. 精选30道Java笔试题解答
  5. matlab保存变量的值,怎么不能保存之前的变量值?求解
  6. boost::process::spawn相关的测试程序
  7. Hadoop掀起大数据革命 三巨头齐发力
  8. arcsoft panorama maker 6_2021年6月30日入宅新居好吗,农历五月二十一是乔迁吉利日吗——天玄网...
  9. 自动布局AutoLayout
  10. 管理端口_内网渗透 | 红蓝对抗:Windows利用WinRM实现端口复用打造隐蔽后门
  11. chrome插件:实现任意窗口,显示特定icon
  12. atom配置python环境_用Python制作网站Django实操与开发环境配置
  13. 松灵机器人Scout代码分析 --- scout_ros
  14. 演示使用Metasploit入侵Windows
  15. linux看温度命令,linux查看cpu温度命令
  16. 炮兵阵地(状压dp)
  17. 《麦肯锡精英的谈判策略》 -豆瓣评分8.2
  18. 手把手教你快速入门 APP 的开发
  19. 【转】售前的成长故事(19篇)
  20. java实现多文件压缩

热门文章

  1. [内网渗透]—权限维持
  2. android 吧文字读出来,android学习之文字语音朗读
  3. 怎么选择国际短信平台?
  4. pyrouge和rouge在Linux上的安装方法以及结果比较
  5. 中文分词算法之--最大匹配法
  6. webservice接口和http接口(API接口)的区别
  7. win7 IE11浏览器怎么降至IE8?
  8. cocos2d-x 3.0 Win7 + VS2012 下实现贪吃蛇小游戏
  9. 【HTML5】HTML语法和基本常用标签(字符集)
  10. vue.js 构建项目_使用Vue.js和AWS Amplify构建Chatbot