Java开发笔记(四十二)日历工具的常见应用

前面介绍了日历工具Calendar的基本用法,乍看起来Calendar与Date两个半斤八两,彷佛没有多大区别,那又何苦庸人自扰鼓捣一个新玩意呢?显然这样小瞧了Calendar,其实它的做用大着呢,接下来不妨深刻探讨一下Calendar的几种实际应用,主要包括:Calendar和Date类型互相转换、计算两个日历时间的天数、打印当前月份的月历等,分别说明以下。html

一、Calendar和Date类型互相转换
虽然说Date早就应该被Calendar取代,但毕竟是前辈,并且Java也一直没有抛弃它,特别有一点:Date拥有搭配的日期格式化工具SimpleDateFormat,能够很方便地输出指定格式的日期时间字符串,敢问Calendar有此绝活么?既然Calendar没法覆盖Date的全部功能,那就必须支持互相转换Calendar和Date类型,从而让日期实例去执行日历实例所不能完成的任务。由于类型转换的要求是Calendar提出来的,因此这个转换动做理应由它实现,这里用到了Calendar的getTime方法和setTime方法,其中getTime方法的返回值就是Date类型的实例,而setTime方法可将Date实例填入Calendar实例。下面是经过getTime和setTime方法转换日期类型和日历类型的代码例子:java

	// 把Calendar类型的数据转换为Date类型
	private static void convertCalendarToDate() {
		// 建立一个日历实例
		Calendar calendar = Calendar.getInstance();
		// 调用日历实例的getTime方法,得到日期信息
		Date date = calendar.getTime();
		System.out.println("convertCalendarToDate date=" + date.toString() + ", calendar=" + calendar.toString());
	}

	// 把Date类型的数据转换为Calendar类型
	private static void convertDateToCalendar() {
		// 建立一个日历实例
		Calendar calendar = Calendar.getInstance();
		// 建立一个日期实例
		Date date = new Date();
		// 调用日历实例的setTime方法,设置日期信息
		calendar.setTime(date);
		System.out.println("convertDateToCalendar date=" + date.toString() + ", calendar=" + calendar.toString());
	}

  

二、计算两个日历时间的天数
根据两个给定的时间,计算两者间隔的天数,这个业务场景也很常见。例如为了安全起见,网站每隔若干天就要求用户从新登陆;又如信用卡还款,银行须要在还款日以前多少天提醒用户等等。这时用到了Calendar的getTimeInMillis方法,该方法可返回毫秒计量的时间总数,只要把两个日历实例的时间总数相减,再把两者的差额从毫秒单位换算成以天为单位,便可求得这两个日历时间之间的天数。据此编写的计算方法代码以下所示:安全

	// 计算两个日历实例间隔的天数
	private static void countDays() {
		Calendar calendarA = Calendar.getInstance();
		// 设置第一个日历实例的年月日
		calendarA.set(2018, 3, 15);
		Calendar calendarB = Calendar.getInstance();
		// 设置第二个日历实例的年月日
		calendarB.set(2018, 9, 15);
		// 得到第一个日历实例包含的时间总数(单位毫秒)
		long timeOfA = calendarA.getTimeInMillis();
		// 得到第二个日历实例包含的时间总数(单位毫秒)
		long timeOfB = calendarB.getTimeInMillis();
		// 先计算两者的差额,再把毫秒计量的差额转换为天数
		long dayCount = (timeOfB-timeOfA)/(1000*60*60*24);
		System.out.println("dayCount="+dayCount);
	}

  

三、打印当前月份的月历
对于期待周末的学生和上班族来讲,一份安排稳当的月历是必不可少的,如今利用Calendar功能便能制做一个简单的月历。月历的每行均为一个星期,行首是星期一,行尾是星期日,而后分行打印当月从1号到月末的全部日子。其中的年、月、星期都是明确的,惟有月末的日子是变化着的,好比一、三、五、七、八、十、12这七个月的月末是31号,四、六、九、11这四个月的月末是30号,2月每逢闰年有29天、其它年份则有28天。假若为了肯定当月的最后一天,就得本身编码判断这些繁复的细节,可谓是绞尽脑汁、伤筋动骨。所幸Calendar早已提供了getActualMaximum方法,该方法用于得到指定时间单位的最大合法值,若是指定的时间单位是Calendar.DATE,则该方法的返回值就为当月的最后一天。因而获取月末日子的代码仅需下列一行而已:工具

		// 获取当月的最后一天
		int lastDay = calendar.getActualMaximum(Calendar.DATE);

 

这下月历具有的全部要素都集齐了,包括当前年份、当前月份、当月1号、当月最后一天,再把中间的日子分星期依次排列,一个简洁朴素的月历便出炉了。下面是使用日历工具计算并打印当前月历的代码例子:网站

	// 打印当前月份的月历
	private static void printMonthCalendar() {
		// 建立一个日历实例
		Calendar calendar = Calendar.getInstance();
		// 设置日期为当月1号
		calendar.set(Calendar.DATE, 1);
		// 得到该日期对应的星期几
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
		dayOfWeek = dayOfWeek==1 ? 7 : dayOfWeek-1;
		// 获取当月的最后一天
		int lastDay = calendar.getActualMaximum(Calendar.DATE);
		// 拼接月历开头的年月
		String yearAndMonth = String.format("\n                     %d年%d月", 
				calendar.get(calendar.YEAR), calendar.get(calendar.MONTH)+1);
		System.out.println(yearAndMonth);
		System.out.println(" 星期一 星期二 星期三 星期四 星期五 星期六 星期日");
		// 先补齐1号前面的空白
		for (int i=1; i<dayOfWeek; i++) {
			System.out.print("       ");
		}
		// 循环打印从一号到本月最后一天的日子
		for (int i=1; i<=lastDay; i++) {
			String today = String.format("%7d", i);
			System.out.print(today);
			// 若是当天是星期日,末尾就另起一行
			if ((dayOfWeek+i-1)%7 == 0) {
				System.out.println();
			}
		}
	}

 

运行上述的月历代码,观察到的打印结果以下图所示。编码



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

相关文章
相关标签/搜索