分享错误,学习生活

JAVA-日历Calendar小结

概念:
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);

打印结果:

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

暂无评论

发表评论

电子邮件地址不会被公开。