Java 8 Time API

Java 8 系列文章 持续更新中
日期时间API 也是Java 8重要的更新之一,Java从一开始就缺少一致的日期和时间方法,Java 8 Date Time API是Java核心API的一个非常好的补充 。
为什么需要新的日期时间APIJava中现有的与日期和时间相关的类存在一些问题:

  • 日期时间类的定义不一致,在java.utiljava.sql包中都有Date类 。同样,格式化和解析类是在java.text包中定义的 。
  • java.util.Date同时包含日期和时间值 , 而java.sql.Date只包含日期值,把它放在java.sql包中是没有意义的 。而且这两个类的名称相同,这本身就是一个非常糟糕的设计 。
  • 没有为时间、时间戳、格式化和解析明确定义的类 。我们有java.text.DateFormat抽象类用于解析和格式化,通常使用SimpleDateFormat类解析和格式化 。
  • 所有Date类都是可变的 , 所以它们不是线程安全的 , 这也是JavaDateCalendar类最大的问题之一 。
  • Date类不提供国际化,不支持时区 。虽然引入了java.util.Calendarjava.util.TimeZone,但是它们也存在上面的问题 。
DateCalendar类中定义的方法还有一些其他的问题,但是上面的问题清楚地表明,Java中需要一个健壮的日期时间API 。这就是为什么 Joda Time 可以成为Java 日期时间高质量的替代品 。
Java 8日期时间设计原则Java 8日期时间API是基于 JSR-310 规范实现的 。目的是为了解决遗留日期时间实现中的所有缺陷 。新的日期时间API的一些设计原则如下:
  • 不变性:新的日期时间API中的所有类都是不可变的,适用于多线程环境 。
  • 关注点分离:新的日期时间API明确区分了人类可读的日期、时间和机器时间(Unix时间戳) , 它为DateTimeDateTimeTimestampTimezone 等定义单独的类 。
  • 清晰性:所有的类中都清晰地定义了方法 , 并执行相同的操作 。例如 , 要获取当前时间实例可以用now()方法,在所有这些类中都定义了format()parse()方法,而不是为它们单独定义一个类 。
    所有类都使用工厂模式和策略模式来更好地操作 。一旦您使用了其中一个类中的方法,使用其他类并不困难 。
  • 实用的操作:所有新的日期时间API类都常见的方法,比如加、减、格式化、解析、在日期/时间中获取单独的部分等等 。
  • 可扩展:新的日期时间API可以在ISO-8601日历系统上工作 , 但是我们也可以在其他非ISO日历上使用它 。
Java 8日期时间API的包Java8日期时间API由以下包组成 。
  • java.time:这是Java 8日期时间API的基本包 。所有主要的基类都是这个包的一部分,例如LocalDateLocalTimeLocalDateTimeInstantPeriodDuration等 。所有这些类都是不可变的和线程安全的 。大多数情况下,这些类足以处理常见的需求 。
  • java.time.chrono:这个包为非ISO日历系统定义了通用API 。我们可以扩展AbstractChronology类来创建我们自己的日历系统 。
  • java.time.format:这个包包含用于格式化和解析日期时间对象的类 。大多数时候我们不会直接使用它们,因为java.time包中的日期时间类已经提供了格式化和解析方法 。
  • java.time.temporal:这个包包含temporal对象 , 我们可以使用它来找出与日期/时间对象相关的特定日期或时间 。例如 , 我们可以使用它们来查找一个月的第一天或最后一天 。您可以很容易地识别这些方法,因为它们的格式总是withXXX
  • java.time.zone:这个包包含用于支持不同时区及其规则的类 。
Java 8日期时间API类的示例下面通过一些日期时间API类的示例,来更好的了解Java 8日期时间API
1.LocalDateLocalDate是一个不可变的日期类,它以yyyy-MM-dd的默认格式表示日期 。可以使用now()方法来获取当前日期,还可以提供年、月和日期的输入参数来创建LocalDate实例 。
这个类为now()提供了一个重载方法,在这里可以传递ZoneId来获取特定时区中的日期 。这个类提供了与

推荐阅读