Java中Date类和Calendar类的常用实例小结
前言
写后台程序的时候,经常需要存储当前服务器的时间戳,使用时间戳也很方便,客户端和服务器端都可以根据自己的需求做各自的转换
在php里,获取当前时间戳使用time()函数,格式化输出通过Date()函数即可,Java里相对复杂一些,这里简单介绍一下
Java语言中的Calendar,Date,DateFormat组成了Java标准的一个基本但是非常重要的部分。日期是商业逻辑计算一个关键的部分,所有的开发者都应该能计算未来的日期,定制日期的显示格式,并将文本数据解析成日期对象
获取UNIX时间戳
在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期的处理。这里简单介绍一下用Date类如何获取当前时间戳
使用系统的当前日期和时间创建一个日期对象并返回一个长整数,这个时间通常称为Java虚拟机(JVM)主机环境的系统时间,单位是毫秒,因此需要除以1000转换成UNIX时间戳
importjava.util.Date; publicclassTimeTest{ publicstaticvoidmain(Stringargs[]){ Datetime=newDate(); System.out.println(time.getTime()/1000);//1387258105 System.out.println(time.toString());//TueDec1713:28:25CST2013 } }
格式化日期
php里可以使用Date()函数定制日期数据的格式用于呈现,Java里需要调用SimpleDateFormat类,例如将当前时间格式化输出:
importjava.text.SimpleDateFormat; importjava.util.Date; publicclassTimeTest{ publicstaticvoidmain(Stringargs[]){ Datetime=newDate(); System.out.println(time.getTime()/1000);//1387260201 SimpleDateFormatsdf=newSimpleDateFormat("yyyy-mm-ddHH:mm:ss");//2013-03-1714:03:21 Stringstr=sdf.format(time); System.out.println(str); } }
将文本解析成日期对象
给定了格式化的时间字符串,例如“2013-12-1714:05:59”,需要将其转换成Date对象,便于获取时间戳获取进行其它格式化操作,可以继续调用SimpleDateFormat类
importjava.text.ParseException; importjava.text.SimpleDateFormat; importjava.util.Date; publicclassTimeTest{ publicstaticvoidmain(Stringargs[]){ Stringtext="2013-12-1714:05:59"; SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); try{ Datetime=sdf.parse(text); System.out.println(time.getTime()/1000); }catch(ParseExceptione){ System.out.println(e.getMessage()); } } }
获取日期的特定部分
通过Date和SimpleDateFormat两个类,我们已经可以实现获取当前时间戳,日期格式化输出,格式化日期字符串转Date对象功能,现在还有一个新的需求,如何获取日期的特定部分,例如当前的小时,当前的天数等,这就需要用到Calendar类了
importjava.util.Calendar; importjava.util.Date; importjava.util.GregorianCalendar; publicclassTimeTest{ publicstaticvoidmain(Stringargs[]){ Datedate=newDate(); GregorianCalendargcalendar=newGregorianCalendar(); gcalendar.setTime(date); intyear=gcalendar.get(Calendar.YEAR); intmonth=gcalendar.get(Calendar.MONTH); intday=gcalendar.get(Calendar.DAY_OF_MONTH); inthour=gcalendar.get(Calendar.HOUR_OF_DAY); intminute=gcalendar.get(Calendar.MINUTE); intsecond=gcalendar.get(Calendar.MINUTE); System.out.println(year+"-"+month+"-"+day+""+hour+":"+minute+":" +second); } }
计算两个日期之间相差的天数
例如计算2010年4月1号和2009年3月11号之间相差的天数,则可以使用时间和日期处理进行计算。
该程序实现的原理为:首先代表两个特定的时间点,这里使用Calendar的对象进行代表,然后将两个时间点转换为对应的相对时间,求两个时间点相对时间的差值,然后除以1天的毫秒数(24小时X60分钟X60秒X1000毫秒)即可获得对应的天数。实现该示例的完整代码如下:
importjava.util.*; /** *计算两个日期之间相差的天数 */ publicclassDateExample1{ publicstaticvoidmain(String[]args){ //设置两个日期 //日期:2009年3月11号 Calendarc1=Calendar.getInstance(); c1.set(2009,3-1,11); //日期:2010年4月1号 Calendarc2=Calendar.getInstance(); c2.set(2010,4-1,1); //转换为相对时间 longt1=c1.getTimeInMillis(); longt2=c2.getTimeInMillis(); //计算天数 longdays=(t2-t1)/(24*60*60*1000); System.out.println(days); } }
输出当前月的月历
该示例的功能是输出当前系统时间所在月的日历,例如当前系统时间是2009年3月10日,则输出2009年3月的日历。
该程序实现的原理为:首先获得该月1号是星期几,然后获得该月的天数,最后使用流程控制实现按照日历的格式进行输出即可。即如果1号是星期一,则打印一个单位的空格,如果1号是星期二,则打印两个单位的空格,依次类推。打印完星期六的日期以后,进行换行。实现该示例的完整代码如下:
importjava.util.*; /** *输出当前月的日历 */ publicclassDateExample2{ publicstaticvoidmain(String[]args){ //获得当前时间 Calendarc=Calendar.getInstance(); //设置代表的日期为1号 c.set(Calendar.DATE,1); //获得1号是星期几 intstart=c.get(Calendar.DAY_OF_WEEK); //获得当前月的最大日期数 intmaxDay=c.getActualMaximum(Calendar.DATE); //输出标题 System.out.println("星期日星期一星期二星期三星期四星期五星期六"); //输出开始的空格 for(inti=1;i<start;i++){ System.out.print(""); } //输出该月中的所有日期 for(inti=1;i<=maxDay;i++){ //输出日期数字 System.out.print(""+i); //输出分隔空格 System.out.print(""); if(i<10){ System.out.print(''); } //判断是否换行 if((start+i-1)%7==0){ System.out.println(); } } //换行 System.out.println(); } }