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

2022-09-01 14:43:29

Java 8 中有一整套 date 类:

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

技术信息和要求:

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

我的问题:

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

答案 1

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

  • 如果要在 / 上下文中使用日期,请使用 .SQLJDBCjava.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

为了执行任务,该类处理从 的本地时间线到的即时时间线的转换(对时间线上的单个瞬时点进行建模)。两条时间线之间的差值(由 a 表示)是 UTC/格林威治的偏移量。ZonedDateTimeLocalDateTimeInstantZoneOffset

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

要获取最大和最小日期,您可以在以下方式中使用 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();

答案 2