Calendar
Calendar 是一个抽象类
用于在特定时间点和一组字段之间进行转换
声明
Calendar rightNow = Calendar.getInstance();//获得当前时间
rightNow.getTime()//获得 型如 Thu Nov 12 00:00:51 CST 1998 的人易读的时间格式
milis = rightNow..getTimeInMillis()// 获得从the Epoch January 1, 1970 00:00:00.000 GMT 到现在的毫秒数 类似 910800007000
set(field,value)设置
设置精确的日期组合方式
For the date fields:
- YEAR + MONTH + DAY_OF_MONTH
- YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
- YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
- YEAR + DAY_OF_YEAR
- YEAR + DAY_OF_WEEK + WEEK_OF_YEAR
时间的设置
For the time of day fields:
- HOUR_OF_DAY
- AM_PM + HOUR
Calendar 中可设置的field这里没有完全给出 具体请参考 java API
set(f,v) 应用
Calendar cal = Calendar.getInstance();//获取当前时间 (timestamp) Mon Mar 09 20:04:26 CST 2020
cal.set(Calendar.YEAR, 1998);
cal.set(Calendar.MONTH, 10);
cal.set(Calendar.DAY_OF_MONTH, 4);
cal.set(Calendar.HOUR_OF_DAY, 0);
System.out.println(calendar.getTime());
//设置日期为 1998年11月4号凌晨
输出
Wed Nov 04 00:04:26 CST 1998
field 是一些代表日期的单词
value 是field的值 可以是数字也可以是对应的英文
但是如果不存在特定的英文名词或者在Calendar 中没有定义则只能用数字
下面是月份和星期所对应的数字及其英文(Calendar中全是大写)
time&date | word | number |
---|---|---|
一月 | January | 0 |
二月 | February | 1 |
三月 | March | 2 |
四月 | April | 3 |
五月 | May | 4 |
六月 | June | 5 |
七月 | July | 6 |
八月 | August | 7 |
九月 | September | 8 |
十月 | October | 9 |
十一月 | November | 10 |
十二月 | December | 11 |
周一 | Monday | 2 |
周二 | Tuesday | 3 |
周三 | Wednesday | 4 |
周四 | Thursday | 5 |
周五 | Friday | 6 |
周六 | Saturday | 7 |
周日 | Sunday | 1 |
我们穿越去即将到来的愚人节 (4.1)
数字设置
calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2020);
calendar.set(Calendar.MONTH, 3);
calendar.set(Calendar.WEEK_OF_MONTH, 1);
calendar.set(Calendar.DAY_OF_WEEK, 4);
System.out.println(calendar.getTime());
输出
Wed Apr 01 20:23:42 CST 2020
英文名词设置
calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 2020);
calendar.set(Calendar.MONTH, Calendar.APRIL);
calendar.set(Calendar.WEEK_OF_MONTH, 1);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
System.out.println(calendar.getTime());
输出
Wed Apr 01 20:23:42 CST 2020
tip: set() 过后的calendar 是不会立即变化的,只有结果计算后calendar才会变化。
上例中,calendar的field的变化是在calendar.getTime()
时如果没有这句话,calendar中的各filed是不变的。
溢出问题
拿4月(30天)来讲,在设置set(Calendar.DAY_OF_MONTH, 31)
不小心给了value = 31,月份会变成日期会变成五月一号,如果设成32就是五月2号。是往前推进的。
get(field)
参数是日期名 如 获得月份
get(Calendar.MONTH)
add(field,delta)
参数是日期名和变化量
变化量课正可负
作用同 set(field , get(field)+delta) 但不同的是 add()是立即立即计算calendar中的值立刻变化
溢出问题
当日期是4月30号时 add(Calendar.DAY_OF_MONTH, 1)
会变成5月1号也是递进的
roll()
roll(int field, boolean up);//当前值上加一(up = true)或者减一(up = false)
roll(int field,int amount);//当前值上加amount(amount可正可负)
问题来了,roll()和add() 功能不是一样吗????(黑人之问)
其区别在
溢出问题
当日期是4月30号时roll(Calendar.DAY_OF_MONTH, 1)
得到的日期是4月1号
懂了吧!roll() 如果溢出则是在当前field的范围内循环,不会进位到高层次。