12

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

用日期进行计算也很容易。与 Java < 1.8 的当前情况相比,可能是最好的改进:

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

我没有清楚地看到版本 < 1.8 之前的优势。

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

4

2 回答 2

29

使用 Java < 8,您需要编写如下内容:

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,您必须手动更改对象的字段(在本示例中为小时),这很容易出错。
  • 易于使用(例如,参见本页底部的表格进行比较):
    • Calendar API 使用起来很复杂,因为它混合了一些概念,例如简单的日期(2015 年 6 月 26 日)和即时时间(2015 年 6 月 26 日上午 10 点 UTC) - 前一个概念没有类
    • 新的 Time API 明确区分了各种日期/时间概念
  • 安全:
    • Calendar API 并不安全:没有什么能阻止您编写cal.set(123, 2)会抛出一个不那么有帮助的ArrayOutOfBoundsException. 新的 API 使用枚举来解决这个问题。
    • 新 API 使用不可变对象,这使其成为线程安全的。

总的来说,新 API 的灵感来自于 jodatime,它在很长一段时间内一直是首选的 Java Date API。您还可以阅读Java (<1.8) 日期与 JodaTime 的详细比较(其中大部分应适用于 Java 8 日期 API)。

于 2013-07-11T05:44:04.780 回答
2

新日期/时间 API 的优势

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

缺点

  • JPA2 尚不支持
  • JSF2 尚不支持
于 2016-01-30T14:27:07.557 回答