【问题标题】:New Date & Time API in Java 8Java 8 中的新日期和时间 API
【发布时间】:2013-07-05 20:01:35
【问题描述】:

this 页面上,我阅读了以下内容:

用日期进行计算也很简单。与 Java

Period p = Period.of(2, HOURS);
LocalTime time = LocalTime.now();
LocalTime newTime = time.plus(p); // or time.plus(5, HOURS); or time.plusHours(5); 

我没有清楚地看到版本

也许有人可以给我一个例子? Atm 我在问自己,新的日期和时间 API 的改进从何而来。

【问题讨论】:

  • 你能用JDK写同样的功能吗?

标签: java datetime java-8 java-time


【解决方案1】:

新日期/时间 API 的优势

  • 日期(LocalDate)、时间(LocalTime)、日期和时间(LocalDateTime)、即时(Instant)的概念更加清晰,与它们在通用语言中的含义相对应。
  • 将日期/时间初始化为特定值变得更容易(方法“of”,例如 LocalDate.of(2016,1,1))
  • 处理闰年(方法 isLeapYear)变得微不足道
  • 添加/减去日期变得非常容易。例如。 10年后的今天参考: LocalDate.now().plusYears(10)
  • 适应直觉的月份编号偏移。 “一月”现在是“1”,而不是以前的“0”

缺点

  • JPA2 尚不支持
  • JSF2 尚不支持

【讨论】:

    【解决方案2】:

    使用 Java

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) + 2);
    

    对比使用 Java 8:

    LocalTime now = LocalTime.now();
    LocalTime later = now.plus(2, HOURS);
    

    这些改进基本上是在

    • 可读性:
      • Calendar.getInstance() 的命名不是很好:如果不阅读 Javadoc,就很难判断 哪个 实例。 LocalTime.now() 非常自我描述:你有时间,它是现在
      • 要偏移日期,您需要调用偏移方法 (plus),而使用日历 API,您必须手动更改对象的字段(在本示例中为小时),这很容易出错。
    • 易于使用(例如,参见this page 底部的表格进行比较):
      • Calendar API 使用起来很复杂,因为它混合了一些概念,例如简单日期(2015 年 6 月 26 日)和即时时间(UTC 时间 2015 年 6 月 26 日上午 10 点) - 前一个概念没有类
      • 新的 Time API 在the various date/time concepts 之间有明确的分隔
    • 安全:
      • Calendar API 不安全:没有什么能阻止您编写cal.set(123, 2),这会抛出一个不太有用的ArrayOutOfBoundsException。新 API 使用枚举来解决这个问题。
      • 新 API 使用不可变对象,这使其成为线程安全的。

    总体而言,新 API 的灵感来自于 jodatime,它在很长一段时间内一直是首选的 Java Date API。你也可以阅读this detailed comparison of Java (<1.8) date vs. JodaTime(大部分应该适用于Java 8 Date API)。

    【讨论】:

    • 嗯......它并没有你在上面看到的那么糟糕:你通常会使用cal.add(Calendar.HOUR, 2)。但我同意新的 API 是一个很大的改进,因为你列出的所有原因。
    • @jahroy 你是对的 - 我已经有一段时间没有使用日期 API 了;-)
    猜你喜欢
    • 2014-07-06
    • 2014-11-08
    • 2016-05-08
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    相关资源
    最近更新 更多