Calendar类的典型应用

来源:互联网 发布:js抢红包源代码 编辑:程序博客网 时间:2024/05/20 14:15

Calendar类的常见用法

1.代码示例

import java.util.*;//静态导入只能在JDK 1.5的编译环境下运行import static java.util.Calendar.*;public class CalendarTest{public static void main(String[] args){Calendar c = Calendar.getInstance();// 取出年System.out.println(c.get(YEAR));// 取出月份System.out.println(c.get(MONTH));// 取出日System.out.println(c.get(DATE));// 分别设置年、月、日、小时、分钟、秒c.set(2016 , 10 , 23 , 12, 32, 23); //2016-11-23 12:32:23System.out.println(c.getTime());// 将Calendar的年前推1年c.add(YEAR , -1); //2016-11-23 12:32:23System.out.println(c.getTime());// 将Calendar的月前推8个月c.roll(MONTH , -8); //2016-03-23 12:32:23System.out.println(c.getTime());Calendar cal1 = Calendar.getInstance();cal1.set(2003, 7, 23, 0, 0 , 0); // 2003-8-23cal1.add(MONTH, 6); //2003-8-23 => 2004-2-23System.out.println(cal1.getTime());Calendar cal2 = Calendar.getInstance();cal2.set(2003, 7, 31, 0, 0 , 0); // 2003-8-31// 因为进位到后月份改为2月,2月没有31日,自动变成29日cal2.add(MONTH, 6); // 2003-8-31 => 2004-2-29System.out.println(cal2.getTime());Calendar cal3 = Calendar.getInstance();cal3.set(2003, 7, 23, 0, 0 , 0); //2003-8-23// MONTH字段“进位”,但YEAR字段并不增加cal3.roll(MONTH, 6); //2003-8-23 => 2003-2-23System.out.println(cal3.getTime());Calendar cal4 = Calendar.getInstance();cal4.set(2003, 7, 31, 0, 0 , 0); //2003-8-31// MONTH字段“进位”后变成2,2月没有31日,// YEAR字段不会改变,2003年2月只有28天cal4.roll(MONTH, 6); //2003-8-31 => 2003-2-28System.out.println(cal4.getTime());}}

 

2.运行结果

2016
8
1
Wed Nov 23 12:32:23 CST 2016
Mon Nov 23 12:32:23 CST 2015
Mon Mar 23 12:32:23 CST 2015
Mon Feb 23 00:00:00 CST 2004
Sun Feb 29 00:00:00 CST 2004
Sun Feb 23 00:00:00 CST 2003
Fri Feb 28 00:00:00 CST 2003

 

3.代码说明

上面的代码示范了Calendar类的用法,Calendar可以很灵活地改变它对应的日期,该示例还演示了add方法和roll方法的区别:roll方法上一级字段不会进位,add方法上一级字段会进位。

 

Calendar类的容错性

1.代码示例

import java.util.*;import static java.util.Calendar.*;public class LenientTest{public static void main(String[] args){Calendar cal = Calendar.getInstance();// 结果是YEAR字段加1,MONTH字段为1(二月)cal.set(MONTH , 13);   //①System.out.println(cal.getTime());// 关闭容错性cal.setLenient(false);// 导致运行时异常cal.set(MONTH , 13);   //②System.out.println(cal.getTime());}}

 

2.运行结果

Wed Feb 01 20:42:00 CST 2017
Exception in thread "main" java.lang.IllegalArgumentException: MONTH
 at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2316)
 at java.util.Calendar.updateTime(Calendar.java:2468)
 at java.util.Calendar.getTimeInMillis(Calendar.java:1087)
 at java.util.Calendar.getTime(Calendar.java:1060)
 at LenientTest.main(LenientTest.java:18)

 

3.代码说明

 Calendar有两种解释日历的模式:lenient模式和non-lenient模式。当Calendar处于lenient模式时,每个字段可接受超出它的范围;当Calendar处于non-lenient模式时,如果某个字段超出它的范围,程序将会抛出异常。

 

Calendar类的延迟修改

1.代码示例

import java.util.*;import static java.util.Calendar.*;public class LazyTest{public static void main(String[] args){Calendar cal = Calendar.getInstance();cal.set(2003 , 7 , 31);  //2003-8-31// 将月份设为9,但9月31日不存在。// 如果立即修改,系统将会把cal自动调整到10月1日。cal.set(MONTH , 8);// 下面代码输出10月1日//System.out.println(cal.getTime());    //①// 设置DATE字段为5cal.set(DATE , 5);    //②System.out.println(cal.getTime());    //③}}

 

2.运行结果

Fri Sep 05 20:52:17 CST 2003

当放开①处代码,运行结果为下

Wed Oct 01 20:55:28 CST 2003
Sun Oct 05 20:55:28 CST 2003

 

3.代码说明

第③处的运行结果出现了不同的结果,很神奇。这是因为set()方法具有延迟修改的特性,即调用set()方法后Calendar实际并没有计算真实的日期,它只是使用内部成员变量记录MONTH字段被修改为8,接着程序设置DATA为5,程序内部再次记录DATE字段为5,就是9月5号。也就是说日期不会立即生效,直到下次调用get()、getTime()、getTimeInMillis()、add()、roll()才会重新计算时间。

 

0 0
原创粉丝点击