Java 8 中的新日期和时间 API

12

这个页面上我读到了以下内容:

使用Java 8进行日期计算也非常简单。与 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之前,我没有清楚地看到优势。

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


2
你能用JDK编写相同的功能吗? - Edwin Dalorzo
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),而使用Calendar API,则必须手动更改对象的字段(在此示例中为小时),这很容易出错。
  • 易用性(例如,请参见this page底部的表格进行比较):
    • Calendar API很难使用,因为它混合了概念,例如简单日期(2015年6月26日)和时间点(2015年6月26日UTC上午10点) - 没有适用于前者概念的类。
    • 新的Time API在the various date/time concepts之间有明确的区分。
  • 安全性:
    • Calendar API不安全:没有任何东西可以阻止您编写cal.set(123, 2),这将抛出一个不太有用的ArrayOutOfBoundsException。新API使用枚举解决了这个问题。
    • 新API使用不可变对象,使其线程安全。
总的来说,新的API受到了jodatime的很大启发,后者已经成为首选的Java日期API已经有一段时间了。你也可以阅读这篇关于Java (<1.8)日期与JodaTime的详细比较(其中大部分内容也适用于Java 8日期API)。

5
嗯...事实并没有你以上所描述的那么糟:通常你会使用cal.add(Calendar.HOUR, 2)。但我同意新的API出于你列举的所有原因都是一个很大的改进。 - jahroy
@jahroy 你说得对 - 我已经有一段时间没有使用日期 API 了 ;-) - assylias

2

新日期/时间API的优势

  • 日期(LocalDate)、时间(LocalTime)、日期时间(LocalDateTime)和瞬时(Instant)的概念更加清晰,符合日常语言的含义。
  • 初始化日期/时间到特定值变得更加简单(使用方法 'of',例如 LocalDate.of(2016,1,1))
  • 处理闰年(使用方法 isLeapYear)变得更加容易
  • 添加/减去日期变得非常容易。例如,要在10年后引用今天:LocalDate.now().plusYears(10)
  • 月份编号偏移量适应了直觉。现在,“一月”是“1”,而不是以前的“0”

缺点

  • JPA2尚未支持
  • JSF2尚未支持

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接