第12章 新的日期和时间API
在Java 1.0中,日期和时间API为java.util.Date
- 实际上是1900年1月1日起的毫秒级时间戳;
- 易用性差,年份从1900年计数,月份从0计数,日子从1计数,
new Date(114, 2, 18);
表示2014年3月18日; - 打印输出不直观,
Tue Mar 18 00:00:00 CST 2014
,包含默认时区中欧时间(Central Europe Time,CET),但本身不支持任何时区操作; - 通过
java.text.DateFormat
格式化和解析java.util.Date
,但线程不安全;
Java 1.1支持的日期和时间API为java.util.Calendar
,未能解决上述问题,易用性差。
java.util.Date
和java.util.Calendar
为可变对象,不易维护。
开发者转向第三方的日期和时间库——Joda-Time,
Java 8在java.time
进行了借鉴和整合,提供了高质量的日期和时间支持。
12.1 LocalDate、LocalTime、Instant、Duration以及Period
12.1 LocalDate、LocalTime、Instant、Duration以及Period
12.2 操纵、解析和格式化日期
12.3 处理不同的时区和历法
12.4 小结
- Java 8之前老版的java.util.Date类以及其他用于建模日期时间的类有很多不一致及设计上的缺陷,包括易变性以及糟糕的偏移值、默认值和命名。
- 新版的日期和时间API中,日期-时间对象是不可变的,老的日期时间对象不会发生变化。
- 用绝对或者相对的方式操纵日期和时间,操作的结果总是返回一个新的实例。
- 按照需求定义日期转换器TemporalAdjuster,一次可以改变多个值,用更精细的方式操纵日期。
- 通过模板/特定格式,创建格式器,打印输出或者解析日期-时间对象,并且它们都是线程安全的。
- 用某个地区/位置的相对方式,或者以与UTC/格林尼治时间的绝对偏差的方式表示时区,并将其应用到日期-时间对象上,对其进行本地化。
- 可以使用不同于ISO-8601标准系统的其他日历系统。