Java 8之前老版的java.util.Date类以及其他用于建模日期时间的类有很多不一致及设计上的缺陷,包括易变性以及糟糕的偏移值、默认值和命名。
新版的日期和时间API中,日期时间对象是不可变的。
新的API提供了两种不同的时间表示方式,有效地区分了运行时人和机器的不同需求。
你可以用绝对或者相对的方式操纵日期和时间,操作的结果总是返回一个新的实例,老的日期时间对象不会发生变化。
TemporalAdjuster让你能够用更精细的方式操纵日期,不再局限于一次只能改变它的一个值,并且你还可按照需求定义自己的日期转换器。
你现在可以按照特定的格式需求,定义自己的格式器,打印输出或者解析日期时间对象。
这些格式器可以通过模板创建,也可以自己编程创建,并且它们都是线程安全的。
你可以用相对于某个地区/位置的方式,或者以与UTC/格林尼治时间的绝对偏差的方式表示时区,并将其应用到日期时间对象上,对其进行本地化。
你现在可以使用不同于ISO-8601标准系统的其他日历系统了。
问题1:为什么在Java8中引入新的日期和时间库
在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类。
Date的缺点:比如:年份的起始选择是1900年,月份的起始从0开始。
// Sat Apr 29 15:59:50 CST 2017
Date date = new Date(System.currentTimeMillis());
// Mon May 29 15:59:50 CST 2017 我们可以看到月份是从0开始的
Date date = new Date(117, 4, 29, 15, 59, 50);
我们看到Date类的toString方法返回的字符串非常误导人,它的返回值甚至包括JVM默认时区CET。
在Java 1.1中,Date类中的很多方法被废弃了,取而代之的是java.util.Calendar类。但是calendar类也有很多类似的问题和缺陷,比如月份从0开始,此外有的特性只在某一个类有提供,比如用于以语言无关方式格式化和解析日期或时间的DateFormat方法就只在Date类里有。
DateFormat方法也有它自己的问题。比如,它不是线程安全的。
因为这些缺陷,Oracle决定在原生的Java API中提供高质量的日期和时间支持。
问题2:LocalDate、LocalTime、Instant、Duration 以及Period的含义和使用
LocalDate类,该类的实例是一个不可变对象,它只提供了简单的日期。
LocalDate date = LocalDate.of(2017, 4, 29);
int year = date.getYear();// 2017
Month month = date.getMonth();// APRIL
int day = date.getDayOfMonth();// 29
DayOfWeek dow = date.getDayOfWeek();// SATURDAY
int len = date.lengthOfMonth();// 30
boolean leap = date.isLeapYear();// false
使用工厂方法从系统时钟中获取当前的日期:
// 2017-04-29
LocalDate today = LocalDate.now();
类似地,一天中的时间,比如13:45:20,可以使用LocalTime类表示。
DateTimeFormatter它是替换老版java.util.DateFormat的推荐替代品.
LocalDateTime,是LocalDate和LocalTime的合体。它同时表示了日期和时间.
Instant 是机器的日期和时间格式
作为人,我们习惯于以星期几、几号、几点、几分这样的方式理解日期和时间。毫无疑问,这种方式对于计算机而言并不容易理解。从计算机的角度来看,建模时间最自然的格式是表示一个持续时间段上某个点的单一大整型数。这也是新的java.time.Instant类对时间建模的方式,基本上它是以Unix元年时间(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的秒数进行计算。
由于LocalDateTime和Instant是为不同的目的而设计的,一个是为了便于人阅读使用,另一个是为了便于机器处理,所以你不能将二者混用。
如果你试图在这两类对象之间创建duration,会触发一个DateTimeException异常。
此外,Duration类主要用于以秒和纳秒衡量时间的长短,你不能仅向between方法传递一个LocalDate对象做参数。
如果你需要以年、月或者日的方式对多个时间单位建模,可以使用Period类。使用该类的工厂方法between,你可以使用得到两个LocalDate之间的时长。