Java语言的Calendar(日历),Date(日期),和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分.日期是商业逻辑计算一个关键的部分.所有的开发者都应该能够计算未来的日期,定制日期的显示格式,并将文本数据解析成日期对象.我们写了两篇文章,这是第一篇,我们将大概的学习日期,日期格式,日期的解析和日期的计算.
我们将讨论下面的类:
1、具体类(和抽象类相对)java.util.Date
2、抽象类java.text.DateFormat和它的一个具体子类,java.text.SimpleDateFormat
3、抽象类java.util.Calendar和它的一个具体子类,java.util.GregorianCalendar
具体类可以被实例化,但是抽象类却不能.你首先必须实现抽象类的一个具体子类.
Date类从Java开发包(JDK)1.0就开始进化,当时它只包含了几个取得或者设置一个日期数据的各个部分的方法,比如说月,日,和年.这些方法现在遭到了批评并且已经被转移到了Calendar类里去了,我们将在本文中进一步讨论它.这种改进旨在更好的处理日期数据的国际化格式.就象在JDK1.1中一样,Date类实际上只是一个包裹类,它包含的是一个长整型数据,表示的是从GMT(格林尼治标准时间)1970年,1月1日00:00:00这一刻之前或者是之后经历的毫秒数.
一、创建一个日期对象r
让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子.这个时间通常被称为Java虚拟机(JVM)主机环境的系统时间.
importjava.util.Date;
publicclassDateExample1{
publicstaticvoidmain(String[]args){
//Getthesystemdate/time
Datedate=newDate();
System.out.println(date.getTime());
}
}
在星期六,2001年9月29日,下午大约是6:50的样子,上面的例子在系统输出设备上显示的结果是1001803809710.在这个例子中,值得注意的是我们使用了Date构造函数创建一个日期对象,这个构造函数没有接受任何参数.而这个构造函数在内部使用了System.currentTimeMillis()方法来从系统获取日期.
那么,现在我们已经知道了如何获取从1970年1月1日开始经历的毫秒数了.我们如何才能以一种用户明白的格式来显示这个日期呢?在这里类java.text.SimpleDateFormat和它的抽象基类java.text.DateFormat就派得上用场了.
二、日期数据的定制格式
假如我们希望定制日期数据的格式,比方星期六-9月-29日-2001年.下面的例子展示了如何完成这个工作:
importjava.text.SimpleDateFormat;
importjava.util.Date;
publicclassDateExample2{
publicstaticvoidmain(String[]args){
SimpleDateFormatbartDateFormat=
newSimpleDateFormat("EEEE-MMMM-dd-yyyy");
Datedate=newDate();
System.out.println(bartDateFormat.format(date));
}
}
只要通过向SimpleDateFormat的构造函数传递格式字符串"EEE-MMMM-dd-yyyy",我们就能够指明自己想要的格式.你应该可以看见,格式字符串中的ASCII字符告诉格式化函数下面显示日期数据的哪一个部分.EEEE是星期,MMMM是月,dd是日,yyyy是年.字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yy"会显示Sat-09-29-01.请察看Sun公司的Web站点获取日期格式化选项的完整的指示.
三、将文本数据解析成日期对象r
假设我们有一个文本字符串包含了一个格式化了的日期对象,而我们希望解析这个字符串并从文本日期数据创建一个日期对象.我们将再次以格式化字符串"MM-dd-yyyy"调用SimpleDateFormat类,但是这一次,我们使用格式化解析而不是生成一个文本日期数据.我们的例子,显示在下面,将解析文本字符串"9-29-2001"并创建一个值为001736000000的日期对象.
例子程序:
importjava.text.SimpleDateFormat;
importjava.util.Date;
publicclassDateExample3{
publicstaticvoidmain(String[]args){
//Createadateformatterthatcanparsedatesof
//theformMM-dd-yyyy.
SimpleDateFormatbartDateFormat=
newSimpleDateFormat("MM-dd-yyyy");
//Createastringcontainingatextdatetobeparsed.
StringdateStringToParse="9-29-2001";
try{
//Parsethetextversionofthedate.
//Wehavetoperformtheparsemethodina
//try-catchconstructincasedateStringToParse
//doesnotcontainadateintheformatweareexpecting.
Datedate=bartDateFormat.parse(dateStringToParse);
//Nowsendtheparseddateasalongvalue
//tothesystemoutput.
System.out.println(date.getTime());
}
catch(Exceptionex){
System.out.println(ex.getMessage());
}
}
}
五、使用标准的日期格式化过程
既然我们已经可以生成和解析定制的日期格式了,让我们来看一看如何使用内建的格式化过程.方法DateFormat.getDateTimeInstance()让我们得以用几种不同的方法获得标准的日期格式化过程.在下面的例子中,我们获取了四个内建的日期格式化过程.它们包括一个短的,中等的,长的,和完整的日期格式.
importjava.text.DateFormat;
importjava.util.Date;
publicclassDateExample4{
publicstaticvoidmain(String[]args){
Datedate=newDate();
DateFormatshortDateFormat=
DateFormat.getDateTimeInstance(
DateFormat.SHORT,
DateFormat.SHORT);
DateFormatmediumDateFormat=
DateFormat.getDateTimeInstance(
DateFormat.MEDIUM,
DateFormat.MEDIUM);
DateFormatlongDateFormat=
DateFormat.getDateTimeInstance(
DateFormat.LONG,
DateFormat.LONG);
DateFormatfullDateFormat=
DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.FULL);
System.out.println(shortDateFormat.format(date));
System.out.println(mediumDateFormat.format(date));
System.out.println(longDateFormat.format(date));
System.out.println(fullDateFormat.format(date));
}
}
注意我们在对getDateTimeInstance的每次调用中都传递了两个值.第一个参数是日期风格,而第二个参数是时间风格.它们都是基本数据类型int(整型).考虑到可读性,我们使用了DateFormat类提供的常量:SHORT,MEDIUM,LONG,和FULL.要知道获取时间和日期格式化过程的更多的方法和选项,请看Sun公司Web站点上的解释.
运行我们的例子程序的时候,它将向标准输出设备输出下面的内容:
9/29/018:44PM
Sep29,20018:44:45PM
September29,20018:44:45PMEDT
Saturday,September29,20018:44:45PMEDT
六、Calendar类r
我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟?我们又如何在日期的这些部分加上或者减去值呢?答案是使用Calendar类.就如我们前面提到的那样,Calendar类中的方法替代了Date类中被人唾骂的方法.
假设你想要设置,获取,和操纵一个日期对象的各个部分,比方一个月的一天或者是一个星期的一天.为了演示这个过程,我们将使用具体的子类java.util.GregorianCalendar.考虑下面的例子,它计算得到下面的第十个星期五是13号.
importjava.util.GregorianCalendar;
importjava.util.Date;
importjava.text.DateFormat;
publicclassDateExample5{
publicstaticvoidmain(String[]args){
DateFormatdateFormat=
DateFormat.getDateInstance(DateFormat.FULL);
//CreateourGregorianCalendar.
GregorianCalendarcal=newGregorianCalendar();
//Setthedateandtimeofourcalendar
//tothesystem'sdateandtime
cal.setTime(newDate());
System.out.println("SystemDate:"+
dateFormat.format(cal.getTime()));
//SetthedayofweektoFRIDAY
cal.set(GregorianCalendar.DAY_OF_WEEK,
GregorianCalendar.FRIDAY);
System.out.println("AfterSettingDayofWeektoFriday:"+
dateFormat.format(cal.getTime()));
intfriday13Counter=0;
while(friday13Counter<=10){
//GotothenextFridaybyadding7days.
cal.add(GregorianCalendar.DAY_OF_MONTH,7);
//Ifthedayofmonthis13wehave
//anotherFridaythe13th.
if(cal.get(GregorianCalendar.DAY_OF_MONTH)==13){
friday13Counter++;
System.out.println(dateFormat.format(cal.getTime()));
}
}
}
}
在这个例子中我们作了有趣的函数调用:
cal.set(GregorianCalendar.DAY_OF_WEEK,
GregorianCalendar.FRIDAY);
和:
cal.add(GregorianCalendar.DAY_OF_MONTH,7);
set方法能够让我们通过简单的设置星期中的哪一天这个域来将我们的时间调整为星期五.注意到这里我们使用了常量DAY_OF_WEEK和FRIDAY来增强代码的可读性.add方法让我们能够在日期上加上数值.润年的所有复杂的计算都由这个方法自动处理.
我们这个例子的输出结果是:
SystemDate:Saturday,September29,2001
当我们将它设置成星期五以后就成了:Friday,September28,2001
Friday,September13,2002
Friday,December13,2002
Friday,June13,2003
Friday,February13,2004
Friday,August13,2004
Friday,May13,2005
Friday,January13,2006
Friday,October13,2006
Friday,April13,2007
Friday,July13,2007
Friday,June13,2008
七、时间掌握在你的手里r
有了这些Date和Calendar类的例子,你应该能够使用java.util.Date,java.text.SimpleDateFormat,和java.util.GregorianCalendar创建许多方法了.
在下面的文章中,我们将讨论更高级的Date和Calendar类的使用技巧,包括时区和国际化的格式.我们还会考察两个日期类java.sql.Date和java.util.Date之间的区别.
分享到:
相关推荐
Java 之 Date 和 Calendar 实例
java中时间类Date和Calendar的使用 java中时间类Date和Calendar的使用 <PRE class=java name="code">package cn.com; import java.text.DateFormat; import java.text.ParseException; import java.text....
Date类顾名思义,一看就知道是和日期有关的类了,这个类最主要的作用就是获得当 前时间了,然而这个类里面也具有设置时间以及一些其他的功能,可是由于本身设计的问题,这些方法却遭到众多批评,而这些遭受批评的...
Java 之 Date 和 CalendarJava 之 Date 和 Calendar
关于java中date和Calendar日期处理小结,包含一些常用方法等
主要为大家详细介绍了Java中Date和Calendar常用用法,感兴趣的小伙伴们可以参考一下
Calendar 和 Date 类 是JAVA很重要的两个类,学好它们对于JAVA学习的道路非常重要
JAVA的Date类与Calendar类.docx
在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理。这里简单介绍一下Date类的使用。使用Date类的默认构造方法创建出的...
本文是关于Date & Calendar类的总结。比较详细,.doc格式文件 。
NULL 博文链接:https://ollevere.iteye.com/blog/1320854
本Java精华内容深入Java API、嵌套类和内部类、与时间有关的类Date,DateFormat,Calendar、文件与流、Java变量类型间的相互转换、Java与Web、用连接池提高Servlet访问数据库的效率、Java扩展、应用服务器的集群策略及...
public LunarCalendar(String year, String month, String date) public LunarCalendar(JComboBox jcYear, JComboBox jcMonth, JComboBox jcDate) public LunarCalendar(int year, int month, int date) public ...
在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理。这里简单介绍一下Date类的使用。
Calendar和Date的转化,java学习总结,java学习总结,java学习总结
主要介绍了Java中Date类和Calendar类的常用实例小结,是Java入门学习中的基础知识的运用,需要的朋友可以参考下
Date与Calendar 两者的区别与联系
第五章.常用类.java.API概述——Date类,Calendar类,SimpleDateFormat类,Big
主要介绍了Java BigInteger类,BigDecimal类,Date类,DateFormat类及Calendar类用法,结合实例形式详细分析了Java使用BigInteger类,BigDecimal类,Date类,DateFormat类及Calendar类进行数值运算与日期运算相关操作...
031105_【第11章:Java常用类库】_日期操作类(Date、Calendar)笔记