当前位置:   article > 正文

java语言中的Calendar_java calendar.day_of_month

java calendar.day_of_month

在java语言中,Calendar.DAY_OF_MONTH表示当前日期在当前月份是第几天(就是Calendar.DATE)。同理Calendar.DAY_OF_WEEK表示当前日期的星期(当前日期不一定是今天,这个日期是可以设定的)

  1. g.set(Calendar.DAY_OF_MONTH, 1);//表示将当前日期设为1号。
  2. int d = g.get(Calendar.DAY_OF_MONTH);
  3. System.out.println(Calendar.DAY_OF_MONTH + ","+ d);

这时程序输出的是5,1

为什么Calendar.DAY_OF_MONTH的值是5?

查询api文档可以看到(也可以看jdk)

 

public static final int

DATE

5

public static final int

DAY_OF_MONTH

5

DATE 和DAY_OF_MONTH全是常量且值为5.那么,我们设定的日期在哪里?java是怎么获取的呢?

在jdk中找到Calendar.java,第1824行(我使用的是jdk1.8.0_31,不同版本可能不一样)找到

  1. public int get(int field)
  2. {
  3. complete();
  4. return internalGet(field);
  5. }

先看返回值,找到internalGet()

  1. protected int fields[];
  2. protected final int internalGet(intfield)
  3. {
  4. return fields[field];
  5. }

这时基本可以确定,原来这些日期一类的变量全都存放在了fields数组中了,而DATE 和DAY_OF_MONTH只是这个数组的下标,(由此也可以看出DATE 和DAY_OF_MONTH没有任何不同)

我们可以在看一下set(1874行)

  1. public void set(int field, intvalue)//(代码省略了)
  2. {
  3. //………
  4. internalSet(field, value);
  5. isTimeSet = false;
  6. areFieldsSet = false;
  7. //………
  8. }
  9. final void internalSet(int field, intvalue)
  10. {
  11. fields[field] = value;
  12. }


证实了之前的猜想。

再来看compute(Line2230)

  1. protected void complete()
  2. {
  3. if (!isTimeSet) {//设置更新时间
  4. updateTime();
  5. }
  6. if (!areFieldsSet || !areAllFieldsSet){
  7. computeFields(); // fills in unsetfields
  8. areAllFieldsSet = areFieldsSet = true;
  9. }
  10. }

可以看出,当程序执行set的时候,日历字段是立即更改的,但是直到下次调用 get()、getTime()、getTimeInMillis()、add() 或 roll()时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调用 set() 不会触发多次不必要的计算。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/549224
推荐阅读
相关标签
  

闽ICP备14008679号