本文介绍java里面的日期时间处理工具。首先介绍JDK自带的API和缺点,然后介绍joda-time,date4j,jsr310(JDK8)新的API。
1. JDK自带的类
日期
- java.util.Date
- java.sql.Date
- java.sql.Timestamp
日历,时区
- java.util.Calendar
- java.util.GregorianCalendar
- java.util.TimeZone
- java.util.SimpleTimeZone
格式化,解析
- java.text.DateFormat
- java.text.SimpleDateFormat
- java.text.DateFormatSymbols
JDK的缺点
- 时区操作容易出错
- Date被设计成了mutable
- Calendar的设计太复杂。(JDK6中Calendar将近2700多行代码,GregorianCalendar将近3000行代码)
- January要设置成0月,年要减去1900
- 计算2天之间差几天不简便
- Timestamp继承自Date,使得equals和hashCode方法的实现比较困难
- Calendar如果要设置hour,有2个域, HOUR和HOUR_OF_DAY都得设置
- 时区和夏令时会受新立法的影响,年年会变,导致JRE要不停的更新
- SimpleDateFormat不是线程安全的
2.
joda-time
本文写作时版本2.3。
joda-time提供了一组Java类包用于处理包括ISO8601标准在内的date和time。可以利用它把JDK Date和Calendar类完全替换掉,而且仍然能够提供很好的集成。
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.3</version>
</dependency>
在springside4里,Showcase中的JodaDemo演示了如何使用joda-time。
joda-time优点
- 易于使用,有getYear()等方法直接访问域,索引值1就是代表January
- 易于扩展,JDK的日历系统是通过Calendar的子类来实现,非常笨重而且事实上要实现其它日历系统是很困难的。joda-time支持多日历系统是通过基于Chronology类的插件体系来实现
- 提供一组完整的功能,日期时间的计算。
- 保持更新的时区计算,基于公共的tz数据库,每年更新几次。
- 当前支持8种日历系统
- 简单的互操作性,内部使用毫秒作为存储,这个JDK是一致的,而且和JDK API兼容。
- 性能更好。
- 测试覆盖率高,质量好。
- 文档,指南齐全。
- 成熟,始于2002年。
- 开源,Apache License
joda-time缺点
- 精度为毫秒,但是timestamp一般要精确到微妙,纳秒
- 类还是mutable的
- 庞大,有138个类
- 还是时区问题,要跟着数据库每年更新
- 安卓上运行慢
- 有些数据库(MySQL)允许不合法的日期'0000-00-00',joda-time处理不了
3.
date4j
date4j是一个用于简化日期和时间操作的Java工具,可以替换JDK Date
本文写作时版本1.5.1。
<dependency>
<groupId>com.darwinsys</groupId>
<artifactId>hirondelle-date4j</artifactId>
<version>1.5.1</version>
</dependency>
date4j优点
- 只有1个public类,DateTime,是immutable的
- 精确到纳秒
- 支持MySQL的不合法日期'0000-00-00'
date4j缺点
- 没有时区信息
- 忽略夏令时,闰秒,尤利乌斯历到格利高里历的切换
4.
jsr310
已经被打入了JDK8的包里。
目标:替换java.util.Date和java.util.Calendar
JSR 310规范领导者和joda-time是同一个作者,借鉴了joda-time,但做了改进。
主要API如下
- Clock,时钟,类似于钟表的概念,提供了如系统时钟、固定时钟、特定时区的时钟
- Instant,瞬时时间,等价于以前的System.currentTimeMillis()
- LocalDateTime/LocalDate/LocalTime,提供了对JDK Date的替代,另外还提供了新的DateTimeFormatter用于对格式化/解析的支持
- ZonedDateTime,带有时区的date-time 存储纳秒、时区和时差
- Duration,表示两个瞬时时间的时间段
- Chronology,用于对年历系统的支持,是java.util.Calendar的替代者
- Period,周期,如表示10天前,3年5个月
5.参考资料
Joda-Time 简介
Spring4新特性——JSR310日期时间API的支持
springside关于joda-time的wiki
分享到:
相关推荐
从Java SE 8开始,要求用户迁移到java.time (JSR-310),这是JDK的核心部分,它替代了此项目。 对于Android用户, java.time是 。 需要支持较低API级别的项目可以使用。 作为Joda-Time的一种形
js-joda是threeten backport的端口,它是Java SE 8 java.time包的JSR-310实现的java.time 。 Threeten的灵感来自Joda-Time ,他的概念和作者相同。 js-joda健壮且稳定。 我们从Threetenbp项目移植了1,700多个测试...
JSR-310(Java Date and Time API)是 Java 8 中引入的一个重大改进,它提供了一个全新的、强大且易于使用的日期和时间处理框架,以取代之前的 `java.util.Date` 和 `java.util.Calendar`。 `nscala_time` 是一个...
- `SimpleDateFormat`是线程不安全的,在多线程环境中应使用线程安全的日期格式工具类或`DateTimeFormatter`(Joda-Time/JSR-310)。 - `ParsePosition`用于跟踪解析过程中的位置,通常不需要手动设置,此处仅作...
* @DateTimeFormat格式化Date、Calendar、Long、JodaTime类型字段的支持。 * 在控制器方法上使用@Valid验证Bean的支持,如果检测到JSR-303 Bean验证的实现。 * 一组HttpMessageConverter,用于在字符串和所需Java...
* 与Java 8同时得到支持的是JSR-310--Date与Time API,在处理时间和日期时,他为开发者提供了java.util.Date或java.util.Calendar更丰富的API。 * 为Groovy开发的应用程序提供了更加顺畅的编程体验,尤其是支持非常...
2. `org.springframework.format.datetime.joda`:处理Joda时间库的日期和时间转换。 3. `org.springframework.format.datetime.standard`:支持Java 8的java.time包中的类型转换。 4. `org.springframework.format....
对于数据验证,如果JSR-303提供者存在于类路径中,`@EnableWebMvc`将支持`@Valid`注解,这允许你在控制器方法的参数上进行校验。 关于HTTP消息转换,`@EnableWebMvc`也自动配置了一系列的`HttpMessageConverter`。...