我应该在 Java 8 中使用哪个日期类?
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.
技术信息和要求:
- 输入是
String
,它被转换为这些日期格式之一. - 我不需要显示时区,但是当我比较两个日期时,能够正确比较纽约和巴黎的时间很重要.
- 精确的级别是秒,不需要使用毫秒.
- 所需的操作:
- 查找最大/最小日期;
- 按日期对对象进行排序;
- 计算日期和时间段(两个日期之间的差异);
- 将对象插入 MongoDB 并按日期从数据库中检索它们(例如,特定日期之后的所有对象).
- The input is in
String
, which is converted to one of these date formats. - 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.
- The precise level is seconds, there is no need to use milliseconds.
- 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).
我的问题:
- 我应该牢记哪些方面才能从性能和性能的这四个选项中选择最佳格式可维护性的观点?
- 我有什么理由不应该避免这些日期课程吗?
推荐答案
每个 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 thejava.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();
相关文章