calendar.getActualMaximum(calendar.DAY_OF_MONTH)的坑点
问题代码如下
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)的坑点相关推荐
- Java Calendar getActualMaximum()方法与示例
日历类的getActualMaximum()方法 (Calendar Class getActualMaximum() method) getActualMaximum() method is ava ...
- java day of month_Java Calendar实例增加DAY_OF_MONTH作为递减(仅)HOUR或MINUTE的副作用
我有一个带有TimePicker(@ id / tyme)的主活动的an unfinished Android app,一个DatePicker(@id / date)和一个TextView(@ id ...
- java calendar getactualmaximum_Java Calendar
1 什么是Calendar? Calendar(读音:[ˈkælɪndə(r)] )是java util包下的一个工具类,提供了不同日期格式的处理. Calendar是一个抽象类,不能用构造器来创建, ...
- java calendar field_Java Calendar详解
一:字段和方法的信息 YEAR 字段: public static final int YEAR ; 指示年的 get 和 set 的字段数字.这是一个特定于日历的值: get 方法: public ...
- 【Calendar】Calendar设置月份为本月最后一天
1.例如: 现在是2017年6月19日:我想设置时间为6月最后一天: 2.思路: 因为要考虑到每个月最后一天是28,29,30,还是31号所以正常思维来做很麻烦:这里我们换一种思路: 找到上个月的第一 ...
- LeetCode#732 My Calendar My Calendar III
LeetCode#732 My Calendar My Calendar III 题目 Implement a MyCalendarThree class to store your events. ...
- java calendar compareto_Java Calendar compareTo()用法及代码示例
Calendar类的add(Calendar Calendar2)方法用于将此Calendar对象的时间值或毫秒偏移与传递的Calendar对象进行比较. 用法: public int compare ...
- Calendar类 Calendar.HOUR(12小时制) 和 Calendar.HOUR_OF_DAY(24小时制)
今天发现调度器设置成上午的时间执行,下午的时间不执行. 查看代码发现: Calendar.HOUR_OF_DAY (24小时)设置成 <span style="font-family: ...
- Java中Calendar.DAY_OF_WEEK、DAY_OF_MONTH需要减一的原因
Java中对日期的处理需要用到Calendar类,其中有几个方法在使用时需要新手注意. 1. 在获取月份时,Calendar.MONTH + 1 的原因(Java中Calendar.MONTH返回的数 ...
最新文章
- AUTOML 和 NAS 的真谛
- 看固态存储厂商在硝烟四起的市场中如何发展?
- numpy笔记:random.permutation
- 精选30道Java笔试题解答
- matlab保存变量的值,怎么不能保存之前的变量值?求解
- boost::process::spawn相关的测试程序
- Hadoop掀起大数据革命 三巨头齐发力
- arcsoft panorama maker 6_2021年6月30日入宅新居好吗,农历五月二十一是乔迁吉利日吗——天玄网...
- 自动布局AutoLayout
- 管理端口_内网渗透 | 红蓝对抗:Windows利用WinRM实现端口复用打造隐蔽后门
- chrome插件:实现任意窗口,显示特定icon
- atom配置python环境_用Python制作网站Django实操与开发环境配置
- 松灵机器人Scout代码分析 --- scout_ros
- 演示使用Metasploit入侵Windows
- linux看温度命令,linux查看cpu温度命令
- 炮兵阵地(状压dp)
- 《麦肯锡精英的谈判策略》 -豆瓣评分8.2
- 手把手教你快速入门 APP 的开发
- 【转】售前的成长故事(19篇)
- java实现多文件压缩
热门文章
- [内网渗透]—权限维持
- android 吧文字读出来,android学习之文字语音朗读
- 怎么选择国际短信平台?
- pyrouge和rouge在Linux上的安装方法以及结果比较
- 中文分词算法之--最大匹配法
- webservice接口和http接口(API接口)的区别
- win7 IE11浏览器怎么降至IE8?
- cocos2d-x 3.0 Win7 + VS2012 下实现贪吃蛇小游戏
- 【HTML5】HTML语法和基本常用标签(字符集)
- vue.js 构建项目_使用Vue.js和AWS Amplify构建Chatbot