乐趣区

关于java:译一文精通-Java-8-时间

一、背景: 为什么新 API

首先,介绍为什么须要创立新的 API。

1.1 java.util.Date 的问题

  • 非确定(固定)的 – 日期实例不是不可变的。
  • 存在并发性问题 – 日期实例是非线程平安的。
  • 不正确的命名 – Date 不是“日期”,而是“工夫戳”(译者注:“泰山”不是泰山,而是一只大猩猩)。
  • 不足约定(标准)– 天从 1 开始,月从 0 开始,年从 1900 开始(译者注:这是很让人摸不着头脑的)。
  • 不间断(不足“晦涩”性)– 不能创立“持续时间”(比方:一个季度、5 分钟)或组合(比方:年 + 月、没有秒的日期)等。

1.2 Java 8 之前的日期工夫相干 API

  • System.currentTimeInMillis() 是不精确的,该 API 能够为多个间断调用返回雷同的值。
  • java.util.Date vs java.sql.Datejava.sql.Date 只是一个没有工夫的 Date。
  • java.sql.Timestampjava.sql.Timestamp 复制的 java.util.Date 增加了纳秒的存储。

1.3 java.util.Calendar 的问题

  • 不足清晰度 – 混合了日期和工夫。
  • 有凌乱的时区反对 – 不太容易切换时区、偏移量等。
  • 存在重大的格局阻碍 – SimpleDateFormatCalendar 不能很好地互操作。
  • 带来了扩大的艰难 – 难以通过扩大 Calendar 创立新的日历零碎。

“Calendar 对于 Date 来说就相当于 贪心的特拉尔兽(译者注:这种动物蠢得令人难以置信,认为如果你看不见它,它也就看不见你了——机灵堪比灌木丛,但十分、十分贪心)“– 钱德拉·冈图尔(约 2000 年)。

二、解决方案?

2.1 JSR-310: Date and Time API 摘自 JSR-310 (https://jcp.org/en/jsr/detail…

  • 次要指标是基于 Java SE 中前两个 API (DateCalendar) 的经验教训,为日期和工夫操作提供一个更高级、更全面的模型
  • 新的 API 将针对所有须要日期和工夫数据模型的应用程序。这个模型将超过类,取代 DateCalendar包含没有工夫的日期、没有日期的工夫、持续时间和距离的示意
  • 新的 API 还将解决相干的日期和工夫问题。其中包含 格式化和解析,思考到 ISO8601 规范 以及它的实现,例如 XML。
  • 新 API 的最终目标是易于应用。API 将须要蕴含 一些弱小的个性,然而不能让这些个性覆盖规范用例。易于应用的一部分包含与现有的 DateCalendar 类的交互……

2.2 JSR-310 的起源

  • JSR-310 的“灵感来自”斯蒂芬·科尔伯恩 **\_(Stephen Colebourne)\_** 的十分风行的 Joda-Time 库,他也是 JSR-310 的领导者。
  • JSR-310 是一种既克服缺点又重构 Joda-Time 局部的办法。http://blog.joda.org/2009/11/…\_4941.html.
  • 查看从 Joda-Time 转换到 Java.time 的 API:http://blog.joda.org/2014/11/…
  • 还能够在 stackoverflow 上查看 Meno Hochschild (Time4J 库的作者)的答复:http://stackoverflow.com/ques…

三、Java8 Date Time 类

Dates and Times: 简略的日期和工夫“容器”

类名 阐明
Instant 存储来自 Java 纪元的工夫戳 + 纳秒
LocalDate 存储没有工夫局部的日期(日历日期)
LocalTime 存储没有日期局部的工夫(挂钟)
LocalDateTime 存储日期和工夫(LocalDate + Local Time)
ZonedDateTime 存储带有时区的日期和工夫
OffsetTime 存储工夫和与 UTC 的偏移量
OffsetDateTime 存储带有工夫和 UTC 偏移量的日期

Ranges and Partials: 时间跨度和范畴

类名 阐明
Duration 以纳秒为单位为工夫。(例如:5 分钟)
Period 以年、月和(或)天为单位的工夫。(例如:2 天)
Month 存储月份。(例如:MARCH 三月)
MonthDay 存储没有年份或工夫的月份和日期(例如:出生日期)
Year 存储年份。(例如:2015)
YearMonth 存储没有日期或工夫的年和月。(例如:信用卡有效期)
DayOfWeek 独自存储一周中的某一天。(例如:WEDNESDAY 星期三)

Chronology: 组织和辨认日期的日历零碎

类名 阐明
Chronology 是创立或获取预建日历零碎的工厂默认为 IsoChronology (例如:ThaiBuddhistChronology)
ChronoLocalDate 在任意年表中存储没有工夫的日期
ChronoLocalDateTime 以任意年表存储日期和工夫
ChronoZonedDateTime 以任意年表模式存储日期、工夫和时区
ChronoPeriod 模仿天 / 时间跨度以用于任意年表
Era 存储工夫线 [通常两个 Chronology,但有时会更多]

四、Java8 Date Time 通用 API 图表

Date and Time:

Ranges:

Partials:

五、流式和语义化的 API

Java 8 日期工夫 API 在操作中引入了某种对称性,从而为开发人员带来欢快的编程体验。上面是 API 中通用的办法的前缀列表。

  • of {类工厂办法前缀} – 应用提供的参数结构一个对象——验证和结构不进行转换。示例:LocalDate.of(...) or Instant.ofEpochSecond(...)
  • from {类工厂办法前缀} – 应用提供的参数结构一个对象——验证、转换和构建。示例:LocalDateTime.from(...) or OffsetTime.from(...)
  • parse {类工厂办法前缀} – 通过解析提供的 CharSequence 参数取得对象。示例:LocalDate.parse(...) or OffsetDateTime.parse(...)
  • format {对象办法前缀} – 应用给定的工夫格局参数格式化对象。示例:localDate.format(formatter)
  • get {对象办法前缀} – 返回指标工夫对象的局部状态。示例:localDate.getDayOfWeek()
  • is {对象办法前缀} – 查问指标工夫对象的局部状态。示例:localTime.isAfter(...)
  • with {对象办法前缀} – 对局部进行更改返回不可变时态对象的一个正本。示例:offsetTime.withHour(...)
  • plus {对象办法前缀} – 返回具备增加工夫的工夫对象的正本。示例:localDate.plusWeeks(...)
  • minus {对象办法前缀} – 返回工夫对象减去工夫的正本。示例:localTime.minusSeconds(...)
  • to {对象办法前缀} – 将工夫对象转换为另一种类型的新工夫对象。示例:localDateTime.toLocalDate(...)
  • at {对象办法前缀} – 应用提供的参数将工夫对象组合成一个新的工夫对象。示例:localDate.atTime(...)

六、译者说

大家好,我是 如梦技术 L.cmMica 作者)感激一起参加翻译的 张亚东 JustAuthJap 作者)、 李寻欢Pig 团队)。

这篇文章躺在译文列表里有一年多了,眼看 Java17 行将公布,然而大部分同学对 Java8 工夫仅仅把握了个皮毛,故翻译进去,心愿对大家有所帮忙。

另外欢送关注咱们 JAVA 架构日记,咱们会定期整顿、翻译业内文章和梳理热门软件更新。另外咱们团队开源有 PigSpringBladeAvueJustAuthIJPayMica 等热门我的项目,欢送 star!!!

退出移动版