在实际软件项目开发中,经常会遇到处理时间和日期的情况。学会处理时间和日期,是程序员的一项基本技能。Java 语言中提供了Date、Calendar、GregorianCalendar、DateFormat、SimpleDateFormat类共同组成了标准日期时间处理类。Date、Calendar和GregorianCalendar位于java.util包中,而DateFormat和SimpleDateFormat位于java.text包中。
Date类
Date类表示特定的瞬间,精确到毫秒。该类提供了很多方法,但是很多已经过时,不推荐使用。
方 法 | 描 述 |
boolean after(Date when) | 测试此日期是否在指定日期之后 |
boolean before(Date when) | 测试此日期是否在指定日期之前 |
long getTime() | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数 |
void setTime(long time) | 设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点 |
DateFormat抽象类与SimpleDateFormat类
java.text.DateFormat是一个抽象类,我们可以使用它用预定义的本地化方式格式化和解析时间日期。因为DateFormat是一个抽象类,所以不能直接实例化,但是它提供了大量的静态方法返回一个具体的子类,让我们可以用不同的方法格式化日期时间。
DateFormat类的getDateInstance()方法返回一个将日期按照默认地区或者特定地区的方式格式化的DateFormat对象,此外,还可以使用DateFormat的常量FULL、LONG、SHORT或DEFAULT来指定格式化的风格。与此类似,DateFormat类的getTimeInstance()方法返回一个DateFormat对象格式化时间,getDateTimeInstance()方法返回一个DateFormat对象格式化日期和时间。这些方法都带有可选的格式化风格的常量以及代表地区的Locale对象的常量。最后,getInstance()方法返回一个默认的DateFormat对象,将时间和日期都按照SHORT样式格式化。
得到了DateFormat类的具体子类后,我们就可以调用具体子类的Format()方法,按照预定义的方式格式化日期时间。
上面对日期时间格式化,都是采用默认的格式进行格式化。如果要采用自定义的格式输出日期时间格式,就要采用DateFormat的具体化子类SimpleDateFormat了。SimpleDateFormat类是一个以与语言环境相关的方式来格式化和分析日期的具体类,它可以让我们选择任何用户定义的日期/时间格式的模式来格式化日期和时间。
创建SimpleDateFormat对象时,需要传入一个日期和时间格式字符串做为格式化的模板。日期和时间格式由日期和时间模式字母所组成的字符串来指定。
模 式 字 母 | 日期或时间元素 | 示例 |
G | 公元 | 公元 |
y | 年 | 1996、 96 |
M | 年中的月份 | 一月、二月 |
w | 年中的周数 | 27 |
W | 月份中的周数 | 2 |
D | 年中的天数 | 189 |
d | 月份中的天数 | 10 |
F | 月份中的星期 | 2 |
E | 星期中的天数 | 星期五 |
a | 上午/下午 标记 | AM/PM |
H | 一天中的小时数(0-23) | 0 |
k | 一天中的小时数(1-24) | 24 |
K | am/pm 中的小时数(0-11) | 0 |
h | am/pm 中的小时数(1-12) | 12 |
m | 小时中的分钟数 | 30 |
s | 分钟中的秒数 | 55 |
S | 毫秒数 | 978 |
z | 时区 | GMT-08:00 |
Z | 时区 | -0800 |
Calendar抽象类与GregorianCalendar类
在JDK第一次发布时,Date类是唯一的代表日期时间的类。但是由于Date类在编写的时候并没有考虑到各个国家的实际情况,在国际化方面考虑不够周到,所以从JDK1.1版本开始,Java中推荐使用Calendar类来处理日期时间,并将很多Date类的方法设置为已经过时。
Calendar类是一个抽象类,它的功能比Date类要强大很多,实现方式也比Date类要复杂。Calendar类提供了很多方法,来完成日期时间之间的相互操作功能。
方法 | 作用 |
add() | 实现在某个日期上的增加若干天、年、月、小时等后的新日期 |
get() | 得到日期对象中的年、月、日、小时、分、秒等 |
set() | 修改日期对象中的年、月、日、小时、分、秒等 |
getInstance() | 返回一个Calendar类型的对象实例 |
因为Calendar类是一个抽象类,所以不能使用构造器来实例化一个Calendar对象.但是Calendar类提供了静态方法getInstance()来获取Calendar类的具体子类的对象,而它唯一一个具体子类是GregorianCalendar类,所以它的getInstance()方法返回的就是一个GregorianCalendar对象。GregorianCalendar类用来代表世界上大多数国家和地区所采用的公历日历。
GregorianCalendar类的无参数构造方法用来描述今天,用年、月、日、小时、分、秒来作为构造方法的参数时用来描述特定的一天。