JAVA-日历Calendar小结

本文总结了Java中Calendar类的关键操作,包括add、set、roll方法的区别,set方法的不同参数形式,before和after方法的用法,setLenient方法在处理异常时间格式时的作用,以及getTime方法获取当前时间的注意事项。示例代码详实,同时提供了完整的代码资源链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念:
Calendar是日历的意思,区别于Date,Date是一个绝对时间,而Calendar是对时间的一种描述方式,不同国家、不同地区描述方式不同

获取Calendar实例的四种方式的区别
1.getInstance():使用默认的时区、默认的位置创建实例
2.getInstance(TimeZone zone):使用指定的时区、默认的位置创建实例
3.getInstance(Locale aLocale):使用默认的时区、指定的位置创建实例
4.getInstance(TimeZone zone,Locale aLocale)使用指定的时区、指定的位置创建实例

示例代码如下:

Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance(Locale.CHINA);
Calendar c3 = Calendar.getInstance(TimeZone.getTimeZone("GMT+9"));
Calendar c4 = Calendar.getInstance(TimeZone.getTimeZone("GMT+9"), Locale.US);

打印结果:

日历信息:java.util.GregorianCalendar[time=1529638080330,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=5,WEEK_OF_YEAR=25,WEEK_OF_MONTH=4,DAY_OF_MONTH=22,DAY_OF_YEAR=173,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=28,SECOND=0,MILLISECOND=330,ZONE_OFFSET=28800000,DST_OFFSET=0]
日历信息:java.util.GregorianCalendar[time=1529638080330,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=5,WEEK_OF_YEAR=25,WEEK_OF_MONTH=4,DAY_OF_MONTH=22,DAY_OF_YEAR=173,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=28,SECOND=0,MILLISECOND=330,ZONE_OFFSET=28800000,DST_OFFSET=0]
日历信息:java.util.GregorianCalendar[time=1529638080330,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+09:00",offset=32400000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=5,WEEK_OF_YEAR=25,WEEK_OF_MONTH=4,DAY_OF_MONTH=22,DAY_OF_YEAR=173,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=28,SECOND=0,MILLISECOND=330,ZONE_OFFSET=32400000,DST_OFFSET=0]
日历信息:java.util.GregorianCalendar[time=1529638080330,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+09:00",offset=32400000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=5,WEEK_OF_YEAR=25,WEEK_OF_MONTH=4,DAY_OF_MONTH=22,DAY_OF_YEAR=173,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=28,SECOND=0,MILLISECOND=330,ZONE_OFFSET=32400000,DST_OFFSET=0]

add/set/roll方法区别

1.add方法:按照指定的时间单位向前/向后推移,会计算得到实际值
2.set方法:设置指定的时间单位,会计算得到实际值
3.roll方法:按照指定的时间单位向前/向后推移,不修改较大的时间单位,只会修改指定的时间单位

示例代码如下:

Calendar c1 = Calendar.getInstance();
//月份会变,天数也会变
c1.add(Calendar.DAY_OF_MONTH, 31);
System.out.println("compareAddSetRoll当前时间:" + c1.getTime());

Calendar c2 = Calendar.getInstance();
//根据实际进行调整,如果本月没有31天,则算到下个月一号
c2.set(Calendar.DAY_OF_MONTH, 31);
System.out.println("compareAddSetRoll当前时间:" + c2.getTime());

Calendar c3 = Calendar.getInstance();
//月份不会变,天数会变
c3.roll(Calendar.DAY_OF_MONTH, 31);
System.out.println("compareAddSetRoll当前时间:" + c3.getTime());

打印结果:

compareAddSetRoll当前时间:Mon Jul 23 11:33:59 CST 2018
compareAddSetRoll当前时间:Sun Jul 01 11:33:59 CST 2018
compareAddSetRoll当前时间:Sat Jun 23 11:33:59 CST 2018


roll(int,int)和roll(int,boolean)的区别
1.roll(int,int):支持向前/向后推移多个时间单元
2.roll(int,boolean):向前/向后推移一个时间单元
示例代码如下:
Calendar c1 = Calendar.getInstance();
c1.roll(Calendar.DAY_OF_MONTH, true);
System.out.println("compareRolls当前时间:" + c1.getTime());
c1.roll(Calendar.DAY_OF_MONTH, false);
System.out.println("compareRolls当前时间:" + c1.getTime());
c1.roll(Calendar.DAY_OF_YEAR, 31);
System.out.println("compareRolls当前时间:" + c1.getTime());
c1.roll(Calendar.DAY_OF_YEAR, -31);
System.out.println("compareRolls当前时间:" + c1.getTime());

打印结果:

compareAddSetRoll当前时间:Mon Jul 23 11:28:00 CST 2018
compareAddSetRoll当前时间:Sun Jul 01 11:28:00 CST 2018
compareAddSetRoll当前时间:Sat Jun 23 11:28:00 CST 2018

set方法的四种不同参数形式的区别

1.set(int filed,int value):在指定时间单位设值
2.set(int year,int month,int day):给年、月、日时间单位设值
3.set(int year,int month,int day,int hourOfDay,int minute):给年、月、日、时、分单位设值
4.set(int year,int month,int day,int hourOfDay,int minute,int second):给年、月、日、时、分、秒单位设值
示例代码如下:
Calendar c1 = Calendar.getInstance();
c1.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("compareSets当前时间:" + c1.getTime());
c1.set(2018, 1, 1);
System.out.println("compareSets当前时间:" + c1.getTime());
c1.set(2018, 1, 1, 1, 1);
System.out.println("compareSets当前时间:" + c1.getTime());
c1.set(2018, 1, 1, 1, 1, 1);
System.out.println("compareSets当前时间:" + c1.getTime());

打印结果:

compareSets当前时间:Fri Jun 01 11:28:00 CST 2018
compareSets当前时间:Thu Feb 01 11:28:00 CST 2018
compareSets当前时间:Thu Feb 01 01:01:00 CST 2018
compareSets当前时间:Thu Feb 01 01:01:01 CST 2018

before/after方法区别

1.before:时间做比较,是否在该时间之前
2.after:时间做比较,是否在该时间之后
验证代码如下:
//当前是2018年
Calendar c = Calendar.getInstance();
Calendar c1 = Calendar.getInstance();
c1.set(Calendar.YEAR, 2017);
System.out.println("当前时间比2017年较早:" + c.before(c1));
System.out.println("当前时间比2017年较晚:" + c.after(c1));

打印结果:

当前时间比2017年较早:false
当前时间比2017年较晚:true

setFirstDayOfWeek方法:因为在不同国家,一周的第一天不同,在美国第一天是SunDay,在中国第一天是MonDay,该方法用来设置具体哪一天是第
一天
示例代码如下:
Calendar c1 = Calendar.getInstance();
System.out.println("一周的第一天是:" + c1.getFirstDayOfWeek());
c1.setFirstDayOfWeek(Calendar.MONDAY);
System.out.println("一周的第一天是:" + c1.getFirstDayOfWeek());

打印结果:

一周的第一天是:1
一周的第一天是:2

setMinimalDaysInFirstWeek()方法:设置最少达到几天就可以算一周
示例代码如下:
Calendar c1 = Calendar.getInstance();
c1.setMinimalDaysInFirstWeek(5);
System.out.println("本月有多少周:" + c1.get(Calendar.WEEK_OF_MONTH));
c1.setMinimalDaysInFirstWeek(2);
System.out.println("本月有多少周:" + c1.get(Calendar.WEEK_OF_MONTH));

打印结果:

本月有多少周:3
本月有多少周:4

setLenient方法:输入异常的时间格式,系统是否自动进行纠正,默认为true

示例代码如下:
Calendar c1 = Calendar.getInstance();
c1.setLenient(true);
c1.set(Calendar.DAY_OF_MONTH, 32);
System.out.println("testSetLenient当前时间:" + c1.getTime());
c1.setLenient(false);
c1.set(Calendar.DAY_OF_MONTH, 32);
System.out.println("testSetLenient当前时间:" + c1.getTime());

打印结果:

testSetLenient当前时间:Mon Jul 02 11:33:32 CST 2018
Exception in thread "main" java.lang.IllegalArgumentException: DAY_OF_MONTH
	at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:2583)
	at java.util.Calendar.updateTime(Calendar.java:2606)
	at java.util.Calendar.getTimeInMillis(Calendar.java:1118)
	at java.util.Calendar.getTime(Calendar.java:1091)
	at com.date.CalendarDemo.testSetLenient(CalendarDemo.java:120)
	at com.date.CalendarDemo.main(CalendarDemo.java:32)

getTime方法:获取当前时间,使用的是默认时区,如果要按指定时区打印,需要修改默认时区

示例代码如下:
Calendar c1 = Calendar.getInstance();
c1.setTimeZone(TimeZone.getTimeZone("GMT-8"));
System.out.println("当前时间:" + c1.getTime());
TimeZone.setDefault(TimeZone.getTimeZone("GMT-8"));
System.out.println("当前时间:" + c1.getTime());

打印结果:

当前时间:Fri Jun 22 11:33:59 CST 2018
当前时间:Thu Jun 21 19:33:59 GMT-08:00 2018

完整代码路径如下:

https://github.com/ingorewho/common-tools/tree/master/java-date




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值