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

Mik*_* B. 14 java datetime timestamp date java-8

Java 8中有一整套日期类:

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

技术信息和要求:

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

我的问题:

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

小智 13

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

  • 如果要在SQL/ JDBCcontext中使用Date ,请使用java.sql.Timestamp.

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

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

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

为了完成您的任务,ZonedDateTime该类处理从本地时间线LocalDateTime到即时时间线的转换Instant(该时间线模拟时间线上的单个瞬时点).由a表示的两个时间线之间的差异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();
Run Code Online (Sandbox Code Playgroud)