Java8的新特性--日期和时间(三)

6、新时间日期API 

Java8日期/时间API是JSR-310的实现,它的实现目标是克服旧的日期实现中所有的缺陷,新的日期/时间API的一些设计原则是:

  • 不变性:新的日期/时间API中,所有的类都是不可变的,这对多线程有好处。
  • 关注点分离:新的API将人可读的日期/时间和机器的日期/时间明确分离,它为日期Date、时间Time、日期时间DateTime、时间戳unix timestamp以及时区定义了不同的类。
  • 清晰:在所有的类中,方法都被明确定义  用以完成相同的行为。举个例子,在所有的类中都定义了now()方法、format()方法、parse()方法,而不是像以前那样专门有一个独立的类。为了更好的处理问题,所有的类都使用了工厂模式和策略模式,一旦你使用了其中某个类的方法,与其他类协同工作并不困难。
  • 实用操作:所有新的日期 时间 API 类都实现了一系列方法用以完成通用的任务,如:加、减、格式化、解析、从日期时间中提取单独部分,等等。
  • 可扩展性:新的日期/时间API是工作在ISO-801日历系统上的,但我们也可以将其应用在非ISO的日历上。
    Java8的新特性--日期和时间(三)

6.1 API包解释 

  • java.time包:这是新的日期/时间API的基础包。所有的主要基础类都是这个包的一部分,如:LocalDate、LocalTime、LocalDateTime、Instant、Duration、Period等。这些类都是不可变的和线程安全的。
  • java.time.chrono 包:这个包为非 ISO 的日历系统定义了一些泛化的 API ,我们可以扩展 AbstractChronology类来创建自己的日历系统。
  • java.time.format 包:这个包包含能够格式化和解析日期时间对象的类,在绝大多数情况下,我们不应该直接使
    用它们,因为 java.time 包中相应的类已经提供了格式化和解析的方法。
  • java.time.temporal 包 :这个包包含一些时态对象,我们可以用其找出关于日期 时间对象的某个特定日期或时间,
    比如说,可以找到某月的第一天或最后一天。你可以非常容易地认出这些方法,因为它们都具有 “ 的格
    式。
  • java.time.zone 包:这个包包含支持不同时区以及相关规则的类。

6.2 使用LocalDate、LocalTime、LocalDateTime

LocalDate、LocalTime、LocalDateTime类的实例是不可变的对象,分别表示使用ISO-8601日历系统的日期、时间、日期和时间

常用方法:
Java8的新特性--日期和时间(三)

6.2.1 使用java.time.LocalDate日期

LocalDate是一个不可变的类,它表示默认格式 (yyyy MM dd) 的日期,我们可以使用 now() 方法得到当前时间,也可以提供输入年份、月份和日期的输入参数来创建一个 LocalDate 实例。该类为 now() 方法提供了重载方法,我们可以传入 ZoneId 来获得指定时区的日期(该类与 java.sql.Date 相同的功能)
Java8的新特性--日期和时间(三)

6.2.2 使用java.time.LocalTime时间

LocalTime是一个不可变的类,它的实例代表一个符合人类可读格式的时间,默认格式是 hh:mm:ss.zzz 。像LocalDate 一样,该类也提供了时区支持,同时也可以传入小时、分钟和秒等输入参数创建实例。
Java8的新特性--日期和时间(三)

6.2.3 使用java.time.LocalDateTime

LocalDateTime是一个不可变的日期 时间对象,它表示一组日期-时间,默认格式是 yyyy-MM-ddTHH:mm:ss.zzz。它提供了一个工厂方法,接收 LocalDate 和 LocalTime 输入参数,创建 LocalDateTime 实例。
Java8的新特性--日期和时间(三)

6.3 java.time.Instant时间戳

时间戳是以Unix元年(UTC时区1970年1月1日00:00  ,UTC时区即本初子午线所在的时区)开始来存储日期时间的。
Java8的新特性--日期和时间(三)

6.4 Duration和Period

  • Period:用于计算两个“日期”间隔
  • Duration:用于计算两个“时间”间隔

6.5 日期API工具

  • TemporalAdjuster:时间校正器。有时我们可能需要获取例如:将日期调整到“下个周日”等操作。
  • TemporalAdjusters:该类通过静态方法提供了大量的常用TemporalAdjuster的实现。例如获取下个周日:

Java8的新特性--日期和时间(三)

6.6 解析与格式化

  • java.time.format.DateTimeFormatter类
    Java8的新特性--日期和时间(三)

6.7 兼容旧的日期/时间

因为旧的日期/时间类已经在几乎所有的应用程序中使用,因此做到向下兼容是必须的。所有,我们需要一些转换类来实现。
从JDK 1.1 开始,使用:
1 使用 Calendar 类实现日期和时间字段之间转换;
2 使用 DateFormat 类来格式化和分析日期字符串;
3 而 Date 只用来承载日期和时间信息。
原有Date 中的相应方法已废弃。不过,无论是 Date ,还是 Calendar ,都用着太不方便了,这是 API 没有设计好的地方。
Java8的新特性--日期和时间(三)Java8的新特性--日期和时间(三)

6.8 时区的处理

Java 8 中加入了对时区的支持,带时区的时间分别为:ZonedDate、ZonedTime、ZonedDateTime。其中每个时区都对应着ID,地区ID都为   “{区域}/{城市}”  的格式,如:Asia/Shanghai

七、接口中的默认方法和静态方法

  • Java8中允许接口中包含具有 具体实现类的方法,该方法称为”默认方法“,默认方法使用default关键字修饰。
  • Java8 中,接口中允许添加静态方法

Java8的新特性--日期和时间(三)

7.1 接口中的默认方法遵循”类优先“原则

若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时:

  • 选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。
  • 接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突