java - Java 8 中新的日期和时间 API

标签 java datetime java-8 java-time

关于 this我阅读了以下页面:

用日期做计算,也很容易。与 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 的改进从何而来。

最佳答案

对于 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() 非常 self 描述:您得到一个时间,它是现在
    • 要偏移日期,您可以调用偏移方法 (plus),而使用日历 API,您必须手动更改对象的字段(在本例中为小时),这是错误的俯卧。
  • 易用性(例如,参见 this page 底部的表格进行比较):
    • Calendar API 使用起来很复杂,因为它混合了概念,例如简单日期(2015 年 6 月 26 日)和即时时间(UTC 时间 2015 年 6 月 26 日上午 10 点)——前一个概念没有类
    • 新的时间 API 在 the various date/time concepts 之间有明确的区分
  • 安全:
    • Calendar API 并不安全:没有什么能阻止您编写 cal.set(123, 2),这会抛出一个不太有用的 ArrayOutOfBoundsException。新的 API 使用枚举解决了这个问题。
    • 新 API 使用不可变对象(immutable对象),这使其成为线程安全的。

总的来说,新的 API 很大程度上受到了 jodatime 的启发,jodatime 在很长一段时间内一直是首选的 Java Date API。您还可以阅读 this detailed comparison of Java (<1.8) date vs. JodaTime (其中大部分应该适用于 Java 8 Date API)。

关于java - Java 8 中新的日期和时间 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17527468/

相关文章:

php - 日期时间和日期范围比较

Python 使用 `time.strftime` 在格式化字符串中显示毫秒

java - Java 8 和 JUnit 5 的 Maven 构建失败

java - 来自数据库和内存中的 NotesDocument 对象之间的区别?

java - Spring Web Flow 与 Google App Engine 兼容吗?我们可以与 GAE 一起使用的 Facelet 中哪个是最好的?

java - On Stack Replacement 编译时,Hotspot JVM 是否进行逃逸分析?

java - 在replaceAll中以编程方式获取捕获组

c# - 计算今天是否是即将到来的周年纪念日(基于某个开始日期)的最佳方法是什么?

java-8 - Stream<T>接口(interface)中filter()方法的实现在哪里?

java - 如何将字符串转换为 lambda 表达式?