我应该在Java 8中使用哪个日期类?

Java 8有一整套日期类:

  • java.time.LocalDateTime ;
  • java.time.ZonedDateTime ;
  • java.time.Instant ;
  • java.time.OffsetDateTime ;
  • java.sql.Timestamp ;
  • java.util.Date

我已经通过他们的JavaDocs并注意到所有这些类都包含我需要的所有方法。 因此,目前,我可以随机选择它们。 但我想有一些理由说明为什么有6个单独的类,每个类都专门用于特定目的。

技术信息和要求:

  1. 输入是String ,它被转换为这些日期格式之一。
  2. 我不需要显示时区,但是当我比较两个日期时,能够正确比较纽约和巴黎的时间非常重要。
  3. 精确级别是秒,不需要使用毫秒。
  4. 所需的操作:
    • 找到最大/最小日期;
    • 按日期排序对象;
    • 计算日期和时间段(两个日期之间的差异);
    • 将对象插入MongoDB并按日期从数据库中检索它们(例如,特定日期之后的所有对象)。

我的问题:

  1. 我应该记住哪些方面,以便从性能和可维护性的角度选择这四个选项中的最佳格式?
  2. 有什么理由可以避免这些日期类别吗?

每个Date类都用于特定目的:

  • 如果要在SQL / JDBC上下文中使用Date,请使用java.sql.Timestamp

  • java.util.Date是旧的Java API,它不是线程安全的,你可以很难处理时间分区,最重要的是,它的设计很糟糕:一个简单的统一是几个月从1开始,而几天从0开始。

  • java.time.LocalDateTime是一个不可变的日期时间对象,它表示日期时间,通常被视为年 – 月 – 日 – 小时 – 分 – 秒,您需要完全正确。

  • java.time.ZonedDateTime类存储所有日期和时间字段,因此您可以使用它来处理类似的值: 27th January 1990 at 15:40.30.123123123 +02:00在欧洲/巴黎时区。

为了完成您的任务, ZonedDateTime类处理从LocalDateTime的本地时间线到Instant的即时时间线的转换(该时间线模拟时间线上的单个瞬时点)。 由ZoneOffset表示的两个时间线之间的差异是与UTC / Greenwich的偏移。

要计算持续时间和周期: java.time.Duration是一个基于时间的时间量,例如’20 .5秒’,和java.time.Period ,这是一个基于日期的时间量(如: 26年,2个月和2天)。

要获取最大和最小日期,您可以使用Java 8 lambdas,例如:

 Date maxDate = list.stream().map(yourInstance -> yourInstance.date).max(Date::compareTo).get(); Date minDate = list.stream().map(yourInstance -> yourInstance.date).min(Date::compareTo).get();