Java 8中的新日期和时间API

Chr*_*311 10 java datetime java-8 java-time

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

要使用日期进行计算,这也很容易.与目前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); 
Run Code Online (Sandbox Code Playgroud)

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

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

ass*_*ias 28

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

Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) + 2);
Run Code Online (Sandbox Code Playgroud)

与Java 8相比:

LocalTime now = LocalTime.now();
LocalTime later = now.plus(2, HOURS);
Run Code Online (Sandbox Code Playgroud)

改进主要是基于

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

总体而言,新API受到jodatime的启发,jodatime已经成为首选的Java Date API已有一段时间了.您还可以阅读Java(<1.8)日期与JodaTime的详细比较(其中大部分应该适用于Java 8 Date API).

  • 嗯......它没有你看上面那么糟糕:你通常会使用[`cal.add(Calendar.HOUR,2)`](http://docs.oracle.com/javase/6/docs/ API/JAVA/util的/ Calendar.html#添加%28int,%20int%29).但我同意,由于您列出的所有原因,新API是一项重大改进. (5认同)