Date是Java最先的日期工具,编程中常常经过它来获取系统的当前时间。固然使用Date也很简单,只要一个new关键字就能建立日期实例,就像如下代码示范的那样:html
// 建立一个新的日期实例,默认保存的是系统时间 Date date = new Date();
有了这个日期实例,再来调用getYear(获取年份)、getMonth(获取月份)、getDate(获取日子)、getDay(获取星期几)、getHours(获取时钟)、getMinutes(获取分钟)、getSeconds(获取秒钟)等方法,便可得到相应的时间单位数值。然而因为Date早在Java诞生之初就一同问世,实际用的时候并不利索,每每须要程序员进行二次加工,才能获得符合现实生活的时间数值。下面列举几个额外处理的例子,说明Date工具备哪些地方须要特别注意:
一、关于如何获取日期实例中的年份
调用日期实例的getYear方法,结果获得的年份数值并不是公元纪年,而是从1900年开始计数的年份。所以getYear方法返回的结果还要加上1900,两者相加之和才是真正的公元年份,因而经过Date获取正常年份的代码应该改为下面这样:java
// 获取日期实例中的年份 int year = date.getYear() + 1900; System.out.println("year="+year);
二、关于如何获取日期实例中的月份
虽然getMonth方法得到的是两位月份,可是该方法的月份竟然是0开始计数的!也就是说,若是当前日期位于一月份,那么getMonth返回的数值为0而不为1;依此类推,若是当前日期位于十二月份,则getMonth返回的数值为11。很明显早期的Java设计人员把十二个月看成一个整型数组了,既然一月份处于该数组的第一个位置,那么它对应的下标就是0。如此一来,若要获得现实生活中的月份序号,必须给getMonth的结果加一才行,修改后的代码以下所示:程序员
// 获取日期实例中的月份 int month = date.getMonth() + 1; System.out.println("month="+month);
三、关于如何获取日期实例中的星期几
按照大众的广泛认知,一个星期中的七天,理应从星期一开头,以星期日结尾。但是日期实例的getDay方法却从星期日开始,接下来才是星期1、星期二等等;而且这七个星期数值依然被看成一个整型的星期数组,因此对于星期日来讲,getDay返回的是0,对于星期一来讲,getDay返回的是1。故而也有必要修正getDay的结果,将星期日对应的数值改成7,处理以后的获取代码示例以下:编程
// 获取日期实例中的星期几 int dayWeek = date.getDay(); dayWeek = (dayWeek==0) ? 7 : dayWeek; // 将星期日对应的数值改成7 System.out.println("dayWeek="+dayWeek);
通过以上的数番折腾,真教人倒吸一口冷气,本来是小学生都知道的常识,不曾想被Date这个日期工具搞得如此诘屈聱牙,可见即使是设计一种编程语言,也得调研一下大众的寻常认知,切不可闭门造车令人徒增烦恼。幸亏经过Date获取其他的时间单位比较常规,像getDate方法返回的就是当月的日子,getHours、getMinutes、getSeconds这三个方法分别返回当前的时钟、分钟、秒钟,这些时间数值的获取代码以下所示:数组
// 获取日期实例中的日子 int dateInt = date.getDate(); System.out.println("dateInt="+dateInt); // 获取日期实例中的时钟 int hour = date.getHours(); System.out.println("hour="+hour); // 获取日期实例中的分钟 int minute = date.getMinutes(); System.out.println("minute="+minute); // 获取日期实例中的秒钟 int second = date.getSeconds(); System.out.println("second="+second); // 获取日期实例中的时间总数(单位毫秒) long time = date.getTime(); System.out.println("time="+time);
除了上述的一系列get***方法可用来获取各类时间单位数值,Date工具还提供了相对应的set***方法,用于设置日期实例的某个时间数值。下面是设置时间单位数值的相关方法说明:
setYear:设置日期实例中的年份。
setMonth:设置日期实例中的月份。
setDate:设置日期实例中的日子。
setHours:设置日期实例中的时钟。
setMinutes:设置日期实例中的分钟。
setSeconds:设置日期实例中的秒钟。
setTime:设置日期实例中的时间总数(单位毫秒)。
时间看似复杂,其实它是一种特殊的数字,只不过被人为换算成年月日、时分秒的各类单位组合。既然数字有大小之分,时间也存在前后顺序,固然咱们不说哪一个时间较大、哪一个时间较小,而说哪一个时间较早、哪一个时间较晚。犹记得数值包装类型提供了equals方法比较两个数字是否相等,Date类型一样提供了equals方法比较两个时间是否相等。与时间相等比起来,你们更关心两个时间的迟早前后关系,因此Date类型又提供了before方法,用来检查A时间是否在B时间以前;也提供了after方法,用来检查A时间是否在B时间以后。如此一来,便有了三种时间校验方法:相等、更早和更晚,显然这三个方法都是检查两个时间的前后关系,不妨将它们统一块儿来,经过方法的返回值来判断两个时间的迟早次序。因而就有了Date类型的compareTo方法,该方法返回-1的时候,表示A时间较早;返回0的时候,表示两个时间相等;返回1的时候,表示B时间较早。最后给出上述时间判断的演示代码:编程语言
// 比较两个日期时间的前后关系 private static void compareDate() { Date dateOld = new Date(); Date dateNew = new Date(); // 设置dateNew的时间总数(单位毫秒)。此处表示给当前时间增长一毫秒 dateNew.setTime(dateNew.getTime()+1); // 比较两个时间是否相等 boolean equals = dateOld.equals(dateNew); System.out.println("equals="+equals); // 比较A时间是否在B时间以前 boolean before = dateOld.before(dateNew); System.out.println("before="+before); // 比较A时间是否在B时间以后 boolean after = dateOld.after(dateNew); System.out.println("after="+after); // 比较A时间与B时间的前后关系。返回-1表示A时间较早,返回0表示两个时间相等,返回1表示B时间较早 int compareResult = dateOld.compareTo(dateNew); System.out.println("compareResult="+compareResult); }
更多Java技术文章参见《Java开发笔记(序)章节目录》工具