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

Posted

技术标签:

【中文标题】我应该在 Java 8 中使用哪个日期类?【英文标题】:Which date class should I use in Java 8? 【发布时间】:2016-05-19 23:34:40 【问题描述】:

Java 8 中有一整套日期类:

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

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

技术信息和要求:

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

我的问题:

    从性能和可维护性的角度来看,为了在这四个选项中选择最佳格式,我应该牢记哪些方面? 我有什么理由不应该避免这些日期课程吗?

【问题讨论】:

恐怕这太宽泛了。您应该从阅读这些类的 Javadoc 开始。对此没有好的答案。 不要在 Java 8 中使用 java.util.Date。 如果您不打算使用 JDBC,我显然不会使用 java.sql.Timestamp。 java.util.Date 是 Java 8 之前的版本,并且以笨重着称。我会选择 Java 8 的 LocalDateTime。 @user1803551,这个问题已经被技术细节缩小和丰富了。 @MikeB。这可能会提供信息:docs.oracle.com/javase/tutorial/datetime/iso/overview.html - 重要的是您试图描述的基础数据。您的字符串只有日期和时间信息 - 它本质上是 LocalDateTime。但是你也提到了时区。当你得到那个字符串时,你知道它在哪个时区吗?另请注意,mongodb 将日期表示为自纪元以来的毫秒数 - Java 中最接近的表示形式是 Instant。您应该提供更多关于这些日期实际代表的背景信息。 【参考方案1】:

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

如果您想在SQL/JDBC 上下文中使用您的日期,请使用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/格林威治的偏移量。

计算持续时间和周期: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();

【讨论】:

以上是关于我应该在 Java 8 中使用哪个日期类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java 8中获得UTC + 0日期?

Day640.Java 8的日期时间类问题 -Java业务开发常见错误

Java 8 日期时间 API

6.4 Java 8的日期时间类

Oracle数据库以date类型保存日期时,Java中用哪个类对应数据库的date类型?

如何在JDK1.8中愉快地处理日期和时间