Java开发笔记(三十九)日期工具Date
date是java最早的日期工具,编程中经常通过它来获取系统的当前时间。当然使用date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样:
// 创建一个新的日期实例,默认保存的是系统时间
date date = new date();
有了这个日期实例,再来调用getyear(获取年份)、getmonth(获取月份)、getdate(获取日子)、getday(获取星期几)、gethours(获取时钟)、getminutes(获取分钟)、getseconds(获取秒钟)等方法,即可获得相应的时间单位数值。然而由于date早在java诞生之初就一同问世,实际用的时候并不利索,往往需要程序员进行二次加工,才能得到符合现实生活的时间数值。下面列举几个额外处理的例子,说明date工具有哪些地方需要特别注意:
1、关于如何获取日期实例中的年份
调用日期实例的getyear方法,结果得到的年份数值并非公元纪年,而是从1900年开始计数的年份。因此getyear方法返回的结果还要加上1900,二者相加之和才是真正的公元年份,于是通过date获取正常年份的代码应该改成下面这样:
// 获取日期实例中的年份
int year = date.getyear() + 1900;
system.out.println("year="+year);
2、关于如何获取日期实例中的月份
虽然getmonth方法获得的是两位月份,但是该方法的月份居然是0开始计数的!也就是说,如果当前日期位于一月份,那么getmonth返回的数值为0而不为1;依此类推,如果当前日期位于十二月份,则getmonth返回的数值为11。很明显早期的java设计人员把十二个月当作一个整型数组了,既然一月份处于该数组的第一个位置,那么它对应的下标就是0。如此一来,若要得到现实生活中的月份序号,必须给getmonth的结果加一才行,修改后的代码如下所示:
// 获取日期实例中的月份
int month = date.getmonth() + 1;
system.out.println("month="+month);
3、关于如何获取日期实例中的星期几
按照大众的普遍认知,一个星期中的七天,理应从星期一开头,以星期日结尾。可是日期实例的getday方法却从星期日开始,接下来才是星期一、星期二等等;并且这七个星期数值依然被当作一个整型的星期数组,所以对于星期日来说,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开发笔记(序)章节目录》
上一篇: php中计算程序运行时间的类代码
下一篇: 凉菜有哪几种?经常食用的凉菜有哪些?