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

时间:2016-02-09 20:11:51

标签: java date datetime timestamp java-8

Java 8中有一整套日期类:

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

技术信息&要求:

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

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

1 个答案:

答案 0 :(得分:12)

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

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

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

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

    < / LI>
  • java.time.ZonedDateTime类存储所有日期和时间字段,因此您可以使用它来处理以下值: {/ 1>}在欧洲/巴黎时区。{/ p>

为完成您的任务,27th January 1990 at 15:40.30.123123123 +02:00类处理从ZonedDateTime的本地时间线到LocalDateTime的即时时间线的转换(该时间线模拟了一个瞬时点)时间线)。由Instant表示的两个时间线之间的差异是与UTC /格林威治的偏移。

要计算持续时间和期限:ZoneOffset是基于时间的时间量,例如&#39; 20.5秒&#39;和java.time.Duration,这是一个日期基于时间的时间(如:26年,2个月和2天)。

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

java.time.Period