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

30

Java 8中有一整套日期类:

我已经阅读了它们的JavaDocs并注意到所有这些类都包含我需要的所有方法。因此,目前可以随机选择它们。但我猜想之所以有6个单独的类,每个类专用于特定的目的,肯定是有原因的。

技术信息和要求:

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

    1. 为了从性能和可维护性的角度选择最佳格式,我应该注意哪些方面?

    2. 是否有任何原因需要避免使用某些日期类?


    3
    恐怕这个问题太泛泛了。你应该从阅读这些类的Javadoc开始。对此没有一个好的答案。 - Tunaki
    2
    不要在Java 8中使用java.util.Date。 - keuleJ
    1
    显然,如果您不打算使用JDBC,我当然不会使用java.sql.Timestamp。java.util.Date是在Java 8之前的版本中使用的,而且相当笨重。我会选择Java 8的LocalDateTime。 - Eric Guan
    2
    @user1803551,这个问题已经通过技术细节被缩小和丰富化了。 - Mike
    2
    @MikeB。这可能会有所帮助:https://docs.oracle.com/javase/tutorial/datetime/iso/overview.html - 重要的是您试图描述的基础数据。您的字符串仅具有日期和时间信息-它本质上是LocalDateTime。但是,您还提到了时区。当您获取该字符串时,您知道它在哪个时区吗?还要注意,mongodb将日期表示为自纪元以来的毫秒数-在Java中最接近的表示方法是Instant。您应该更详细地说明这些日期实际上代表什么。 - assylias
    显示剩余5条评论
    1个回答

    23

    Date类是根据特定目的而设计的:

    • 如果您想在 SQL/JDBC 上下文中使用日期,请使用 java.sql.Timestamp

    • java.util.Date 是旧的 Java API,它不是线程安全的,您难以处理时区,并且最重要的是,它设计得很差:一个简单的一致性是,月份从1开始,而日期从0开始。

    • java.time.LocalDateTime 是一个不可变的日期时间对象,通常表示为年-月-日-时-分-秒,这正好是您需要的。

    • java.time.ZonedDateTime 类存储所有日期和时间字段,因此您可以使用它来处理诸如“1990年1月27日下午3:40.30.123123123 +02:00”的值,该值位于欧洲/巴黎时区。

    对于您的任务,ZonedDateTime 类负责将 LocalDateTime 的本地时间线转换为 Instant 的即时时间线(表示时间线上的单个瞬间点)。两个时间线之间的差异由 ZoneOffset 表示,它是相对于 UTC/Greenwich 的偏移量。

    要计算持续时间和周期:有 java.time.Duration(基于时间的时间量,例如“20.5秒”)和 java.time.Period(基于日期的时间量,如“26年2个月2天”)。

    要获取最大和最小日期,您可以在类似以下的 Java 8 lambda 中使用:

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

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