欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java开发笔记(四十一)日历工具Calendar

程序员文章站 2022-05-27 22:56:44
前面的文章提到,Date是Java最早的日期工具,估计当时的设计师是个技术宅男,未经过充分调研就拍脑袋写下了Date的源码,造成该工具存在先天不足,比如getYear方法返回的不是纯正的公元纪年、getHours方法无法区分12小时制和24小时制等等,这很不利于Java语言的国际化。故而从JDK1. ......

前面的文章提到,date是java最早的日期工具,估计当时的设计师是个技术宅男,未经过充分调研就拍脑袋写下了date的源码,造成该工具存在先天不足,比如getyear方法返回的不是纯正的公元纪年、gethours方法无法区分12小时制和24小时制等等,这很不利于java语言的国际化。故而从jdk1.1开始,java又提供了一个日历工具calendar,官方建议采用calendar替代date,并且date的相关get方法都被标记为deprecated(意思是已废弃)。接下来就来看看这个全新的calendar该当如何使用。
首先,创建日历实例调用的是getinstance方法,而非new关键字,日历实例的获取代码如下所示:

		// 创建一个日历实例
		calendar calendar = calendar.getinstance();

 

其次,调用日历实例的get方法,获得指定时间单位的具体数值,例如类型calendar.year对应的是公元年份,类型calendar.month对应的是月份序号等等,以年份为例,具体的获取代码如下所示:

		// 获取日历实例中的年份
		int year = calendar.get(calendar.year);
		system.out.println("year="+year);

 

从以上代码可见,此时得到的年份数值无需额外加上1900,果然比date省事多了。不过通过calendar获取其它时间单位仍有两点需要注意:
1、calendar的月份依然从0开始计数,也就是说,日历工具获取的一月份数值为0,十二月份的数值为11,于是获取月份的代码需要记得加一:

		// 获取日历实例中的月份
		int month = calendar.get(calendar.month)+1;
		system.out.println("month="+month);

 

2、原来date的星期几从0开始计数,现在calendar的星期几改为从1开始计数,可谓一大进步,不料它的星期仍旧以星期日打头、以星期六结尾。也就是说,日历工具获取的星期日数值为1,星期一数值为2,这样一来只好由程序员手工调整,按照国人习惯把星期一对应的数值改为1、把星期日对应的数值改为7等等。修改后的星期获取代码示例如下:

		// 获取日历实例中的星期几
		int dayofweek = calendar.get(calendar.day_of_week);
		dayofweek = dayofweek==1 ? 7 : dayofweek-1;
		system.out.println("dayofweek="+dayofweek);

 

其它的时间单位中规中矩,无需额外的处理,与date相比,calendar新增了类型calendar.day_of_year(从年初开始数的日子),以及calendar.millisecond(秒钟后面的毫秒),另外把时钟区分为calendar.hour(十二小时制的时钟数值)和calendar.hour_of_day(二十四小时制的时钟数值)两种类型。这些普通时间单位的获取代码如下所示:

		// 获取日历实例中的日子
		int dayofmonth = calendar.get(calendar.day_of_month);
		system.out.println("dayofmonth="+dayofmonth);
		// 获取日历实例中从年初开始数的日子
		int dayofyear = calendar.get(calendar.day_of_year);
		system.out.println("dayofyear="+dayofyear);
		// 获取日历实例中的时钟(12小时制)
		int hour = calendar.get(calendar.hour);
		system.out.println("hour="+hour);
		// 获取日历实例中的时钟(24小时制)
		int hourofday = calendar.get(calendar.hour_of_day);
		system.out.println("hourofday="+hourofday);
		// 获取日历实例中的分钟
		int minute = calendar.get(calendar.minute);
		system.out.println("minute="+minute);
		// 获取日历实例中的秒钟
		int second = calendar.get(calendar.second);
		system.out.println("second="+second);
		// 获取日历实例中的毫秒
		int millisecond = calendar.get(calendar.millisecond);
		system.out.println("millisecond="+millisecond);

 

再次,calendar提供了set方法用于设置时间数值,并且重载了参数个数不同的多种set方法,其中带三个参数的set方法支持同时设置年月日,带六个参数的set方法支持同时设置年月日、时分秒。这两种set方法的调用代码示例如下:

		calendar calendar = calendar.getinstance();
		// 调用带三个参数的set方法同时设置日历实例的年、月、日
		calendar.set(2018, 11, 27);
		// 调用带六个参数的set方法同时设置日历实例的年、月、日、时、分、秒
		calendar.set(2018, 11, 27, 12, 30, 40);

 

如果只想修改某个时间单位,则可调用带两个参数的set方法,第一个参数为单位类型包括calendar.year、calendar.month等等,第二个参数为具体的时间数值。比如以下的代码表示把某个日期改为当月1号:

		// 带两个参数的set方法允许把某个时间单位改为指定数值
		calendar.set(calendar.day_of_month, 1);
		system.out.println("end set dayofmonth="+calendar.get(calendar.day_of_month));

 

注意到以上代码设置的日期是绝对值,有时候可能需要在当前日期上增增减减,也就是设置日期的相对值,此时可以联合使用get和set方法,先通过get方法获得当前的时间数值,对当前数值增减之后再传给set方法。下面的代码便演示了设置时间相对值的实现过程:

		// 联合使用get和set方法,可对某个时间单位进行增减
		int dayresult = calendar.get(calendar.hour_of_day) + 1; // 给当前日期加上一天
		calendar.set(calendar.hour_of_day, dayresult);
		system.out.println("end set hourofday="+calendar.get(calendar.hour_of_day));

 

联合使用get和set方法固然实现了相对时间的修改,可是简简单单的功能还得两个步骤稍显繁琐,因此calendar另外提供了add方法,利用add方法允许直接设置相对数值,就像下列代码示范的那样:

		// 调用add方法,直接在当前时间的基础上增加若干数值
		calendar.add(calendar.minute, 10); // 给当前时间加上10分钟
		system.out.println("end add minute="+calendar.get(calendar.minute));

 

日历工具calendar就像它的前辈date一样,仍然保留了与时间校验相关的几个方法,包括equals、before、after、compareto方法等,并且它们的用法与date类型的同名方法保持一致,这里不再赘述,还是直接看下面的时间比较代码好了:

	// 比较两个日历时间的先后关系
	private static void comparecalendar() {
		calendar calendarold = calendar.getinstance();
		calendar calendarnew = calendar.getinstance();
		// 给calendarnew加上一秒
		calendarnew.add(calendar.second, 1);
		// 比较两个时间是否相等
		boolean equals = calendarold.equals(calendarnew);
		system.out.println("equals="+equals);
		// 比较a时间是否在b时间之前
		boolean before = calendarold.before(calendarnew);
		system.out.println("before="+before);
		// 比较a时间是否在b时间之后
		boolean after = calendarold.after(calendarnew);
		system.out.println("after="+after);
		// 比较a时间与b时间的先后关系。返回-1表示a时间较早,返回0表示两个时间相等,返回1表示b时间较早
		int compareresult = calendarold.compareto(calendarnew);
		system.out.println("compareresult="+compareresult);
	}

  

更多java技术文章参见《java开发笔记(序)章节目录