赞
踩
在java语言中,Calendar.DAY_OF_MONTH表示当前日期在当前月份是第几天(就是Calendar.DATE)。同理Calendar.DAY_OF_WEEK表示当前日期的星期(当前日期不一定是今天,这个日期是可以设定的)
- g.set(Calendar.DAY_OF_MONTH, 1);//表示将当前日期设为1号。
- int d = g.get(Calendar.DAY_OF_MONTH);
- System.out.println(Calendar.DAY_OF_MONTH + ","+ d);
这时程序输出的是5,1
为什么Calendar.DAY_OF_MONTH的值是5?
查询api文档可以看到(也可以看jdk)
public static final int | 5 | |
5 |
DATE 和DAY_OF_MONTH全是常量且值为5.那么,我们设定的日期在哪里?java是怎么获取的呢?
在jdk中找到Calendar.java,第1824行(我使用的是jdk1.8.0_31,不同版本可能不一样)找到
- public int get(int field)
- {
- complete();
- return internalGet(field);
- }
先看返回值,找到internalGet()
- protected int fields[];
- protected final int internalGet(intfield)
- {
- return fields[field];
- }
这时基本可以确定,原来这些日期一类的变量全都存放在了fields数组中了,而DATE 和DAY_OF_MONTH只是这个数组的下标,(由此也可以看出DATE 和DAY_OF_MONTH没有任何不同)
我们可以在看一下set(1874行)
- public void set(int field, intvalue)//(代码省略了)
- {
- //………
- internalSet(field, value);
- isTimeSet = false;
- areFieldsSet = false;
- //………
- }
- final void internalSet(int field, intvalue)
- {
- fields[field] = value;
- }
证实了之前的猜想。
再来看compute(Line2230)
- protected void complete()
- {
- if (!isTimeSet) {//设置更新时间
- updateTime();
- }
- if (!areFieldsSet || !areAllFieldsSet){
- computeFields(); // fills in unsetfields
- areAllFieldsSet = areFieldsSet = true;
- }
- }
可以看出,当程序执行set的时候,日历字段是立即更改的,但是直到下次调用 get()、getTime()、getTimeInMillis()、add() 或 roll()时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调用 set() 不会触发多次不必要的计算。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。