引言
最近偶遇apache开发的工作java工具包,一使用,就发现自己爱上它了。不多说了,下面介绍org.apache.commons.lang3.time包中处理java程序员为之头疼的时间的类。
附上官网jar包下载地址:http://commons.apache.org/proper/commons-lang/download_lang.cgi
在这之前还是先简单说一下java本身的时间处理类。
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为 protected。
具体可见API手册。
SimpleDateFromat不是线程安全的,这是因为它继承了DateFormat中的一个Calendar成员,每次在执行format操作时,都会改成成员calendar的状态。这就是不安全的根源。
多线程下,很可能对Calendar的写 和 读 操作不同步(不是被同一个线程执行的),就会发生意外。
下面开始介绍文章的主角类。
提供了对时间对象的运算操作,就像和操作 int 一样。
工具类,不允许创建实例
将时间转化为字符串的工具类。不可实例化对象。
线程安全。
这个类中的所有重载的format 实质都是调了下面2个函数。而这2个函数中又借用了FastDateFormat的API。
FastDateFormat是apache time util 优于Java SimpleDateFormat 的核心类。它是线程安全的。
DateUtils 在parse时内部利用了java自身的SimpleDateFormat(即便如此,DateUtils的操作都是是线程安全的,因为SimpleDateFromat是作为方法的局部变量使用的),而 DateFormatUtils 利用了apache开发的线程安全的FastDateFromat。因此,DateUtils和DateFormatUtils可以满足简单的时间操作了。如果需要更多的定制化操作,就可能需要
下面介绍的FastDateFormat了。
FastDateFormat是一个快速 且 线程安全的时间操作类,它完全可以替代SimpleDateFromat。
因为是线程安全的,所以你可以把它作为一个类的静态字段使用
构造函数为protected,不允许直接构造它的对象,可以通过工厂方法获取。
FastDateFormat之所以是线程安全的,是因为这个类是无状态的:内部的成员在构造时就完成了初始化,并在对象存活期,不提供任何API供外界修改他们。
FastDateFormat内部有很重要的2个对象:
分别完成解析和format工作。他们也都是线程安全的,都修饰为final。有兴趣的可以取读源代码。
例子:
SimpleDateFormat的时间字符串表达模式定义表