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

2022-01-13 00:00:00 datetime timestamp date java-8 java

Java 8 中有一整套日期类:

There is a whole set of date's classes in Java 8:

  • java.time.LocalDateTime;
  • java.time.ZonedDateTime;
  • java.time.即时;
  • java.time.偏移日期时间;
  • java.sql.时间戳;
  • java.util.日期.
  • java.time.LocalDateTime;
  • java.time.ZonedDateTime;
  • java.time.Instant;
  • java.time.OffsetDateTime;
  • java.sql.Timestamp;
  • java.util.Date.

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

I already passed over their JavaDocs and paid attention that all these classes contain all the methods I need. Thus, for the moment, I can select them randomly. But I guess that there is some reason why there are 6 separate classes and each of them is dedicated to the specific purpose.

技术信息和要求:

  1. 输入是 String,它被转换为这些日期格式之一.
  2. 我不需要显示时区,但是当我比较两个日期时,能够正确比较纽约和巴黎的时间很重要.
  3. 精确的级别是秒,不需要使用毫秒.
  4. 所需的操作:
    • 查找最大/最小日期;
    • 按日期对对象进行排序;
    • 计算日期和时间段(两个日期之间的差异);
    • 将对象插入 MongoDB 并按日期从数据库中检索它们(例如,特定日期之后的所有对象).
  1. The input is in String, which is converted to one of these date formats.
  2. I don't need to display the time zones but when I compare two dates it's important to be capable to compare correctly the time in New York and in Paris.
  3. The precise level is seconds, there is no need to use milliseconds.
  4. The required operations:
    • find max/min date;
    • sort objects by date;
    • calculate date & time period (difference between two dates);
    • insert objects to MongoDB and retrieve them from a db by date (e.g. all objects after specific date).

我的问题:

  1. 我应该牢记哪些方面才能从性能和性能的这四个选项中选择最佳格式可维护性的观点?
  2. 我有什么理由不应该避免这些日期课程吗?

推荐答案

每个 Date 类都有特定用途:

Each one of the Date classes are for specific purposes:

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

  • If you want to use your Date in an SQL/JDBC context, use the java.sql.Timestamp.

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

java.util.Date is the old Java API, it is not thread safe, you can difficultly handle time zoning, and on the top of all, it is poorly designed: one simple uniformity is that months start from 1 while days start from 0.

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

java.time.LocalDateTime is an immutable date-time object that represents a date-time, often viewed as year-month-day-hour-minute-second, which you need exactly.

java.time.ZonedDateTime 类存储所有日期和时间字段,因此您可以使用它来处理以下值:1990 年 1 月 27 日 15:40.30.123123123 +02:00,欧洲/巴黎时区.

java.time.ZonedDateTime class stores all date and time fields, so you can use it to deal with values like: 27th January 1990 at 15:40.30.123123123 +02:00 in the Europe/Paris time-zone.

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

To do your task, the ZonedDateTime class handles conversion from the local time-line of LocalDateTime to the instant time-line of Instant(which models a single instantaneous point on the time-line). The difference between the two time-lines, represented by a ZoneOffset, is the offset from UTC/Greenwich.

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

To calculate duration and period: there is the java.time.Duration which is a time-based amount of time, such as '20.5 seconds', and java.time.Period, which is a date-based amount of time (like: 26 years, 2 months and 2 days).

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

To get max and min dates, you can use the Java 8 lambdas in something like:

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

相关文章