Java 我们如何决定使用ZonedDateTime还是LocalDateTime?

Java 我们如何决定使用ZonedDateTime还是LocalDateTime?,java,Java,有时,当我们想要解决某些日期/时间问题时,我们发现很难做出判断,是使用ZonedDateTime还是使用LocalDateTime 例如,给定一个时代,我们想知道一周中的哪一天 我们发现我们可以通过ZonedDateTime或LocalDateTime完成这项任务。下面是代码示例 import java.time.*; public class Main { public static void main(String[] args) { long currentTim

有时,当我们想要解决某些日期/时间问题时,我们发现很难做出判断,是使用
ZonedDateTime
还是使用
LocalDateTime

例如,给定一个时代,我们想知道一周中的哪一天

我们发现我们可以通过
ZonedDateTime
LocalDateTime
完成这项任务。下面是代码示例

import java.time.*;

public class Main {
    public static void main(String[] args) {
        long currentTimeMillis = System.currentTimeMillis();

        // Yield correct result.
        System.out.println("useLocalDateTime -> " + useLocalDateTime(currentTimeMillis));

        // Also yield correct result.
        System.out.println("useZonedDateTime -> " + useZonedDateTime(currentTimeMillis));
    }

    public static DayOfWeek useLocalDateTime(long currentTimeMillis) {
        LocalDateTime localDateTime = LocalDateTime.ofInstant(
                Instant.ofEpochMilli(currentTimeMillis),
                ZoneId.systemDefault()
        );

        DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();

        return dayOfWeek;
    }

    public static DayOfWeek useZonedDateTime(long currentTimeMillis) {
        ZonedDateTime zonedDateTime = Instant.ofEpochMilli(currentTimeMillis).atZone(ZoneId.systemDefault());

        DayOfWeek dayOfWeek = zonedDateTime.getDayOfWeek();

        return dayOfWeek;
    }
}

在上述情况下,使用
ZonedDateTime
还是
LocalDateTime
更好?是否有任何指导原则,以便我们可以选择正确的类作为工具


我总是觉得
ZonedDateTime
LocalDateTime
更“功能丰富”。无论通过
LocalDateTime
可以实现什么,它也可以通过
ZonedDateTime
实现,但反之亦然。因此,如果我无法确定选择哪一个,我将默认转到
zoneDateTime
。这是一个正确的概念吗?

您需要存储附加到特定时区的时间数据,还是需要处理具有相关偏移量的时间数据

如果需要,请使用
ZoneDateTime

如果没有,请使用
LocalDateTime

我希望使用
ZoneDateTime
的一些示例:

  • 我正在解析带有区域信息的ISO8601时间戳
  • 我正在查看来自两个物理上不同位置的两个不同来源的数据
  • 我想计算一周中哪一天有时间戳
我希望使用
LocalDateTime
的一些示例:

  • 我确信我的系统只需要关心一个时区——我的时区
  • 我正在解析的数据没有时间戳信息
  • 我想知道两个时间戳之间经过了多少秒。如果时间戳为ISO 8601格式,则在最终衰减为
    持续时间
    之前,可能会先将其转换为
    ZonedDateTime

当然要注意时区之间的一周中的几天,因为国际日期行可以根据您的实际位置偏移一周中的几天。

您需要存储附加到特定时区的时间数据,还是需要处理具有相关偏移的时间数据

如果需要,请使用
ZoneDateTime

如果没有,请使用
LocalDateTime

我希望使用
ZoneDateTime
的一些示例:

  • 我正在解析带有区域信息的ISO8601时间戳
  • 我正在查看来自两个物理上不同位置的两个不同来源的数据
  • 我想计算一周中哪一天有时间戳
我希望使用
LocalDateTime
的一些示例:

  • 我确信我的系统只需要关心一个时区——我的时区
  • 我正在解析的数据没有时间戳信息
  • 我想知道两个时间戳之间经过了多少秒。如果时间戳为ISO 8601格式,则在最终衰减为
    持续时间
    之前,可能会先将其转换为
    ZonedDateTime

当然要注意时区之间的一周中的几天,因为国际日期行可以根据您的实际位置抵消一周中的几天。

而不是使用
System.currentTimeMillis()
使用或。在现代Java中,几乎不需要
currentTimeMillis()
。在整个应用程序中使用专用的
java.time
API,以便使用类型良好的数据结构,而不是像
long currentTimeMillis
这样的原语


给定一个时代,我们想知道一周中的哪一天

值得承认的是,没有时区,这不是一个有意义的问题;在任何时候,地球上不同的地方每周都有两天(或更多?)的时间。因此,在我们进一步讨论之前,我们需要问一下您关心哪个时区

一般来说,
systemDefault()
时区不是您想要的。相反,调用者应该提供他们期望的时区。如果您的程序在本地运行,并且只需要计算机的时钟,这可能没问题,但是将
LocalDateTime
ZonedDateTime
分开的原因是系统通常不是要使用的正确时区


对于一般情况,例如,本地计算机上运行的Java进程不关心时区随时间的变化,您可以正确使用系统时区。但是在这种情况下,最好在
main()
方法附近查询系统,然后通过应用程序传递该区域。如果系统区域不再是正确的方法,这将使应用程序更具可扩展性和可测试性。

而不是使用
system.currentTimeMillis()
使用或。在现代Java中,几乎不需要
currentTimeMillis()
。在整个应用程序中使用专用的
java.time
API,以便使用类型良好的数据结构,而不是像
long currentTimeMillis
这样的原语


给定一个时代,我们想知道一周中的哪一天

值得承认的是,没有时区,这不是一个有意义的问题;在任何时候,地球上不同的地方每周都有两天(或更多?)的时间。因此,在我们进一步讨论之前,我们需要问一下您关心哪个时区

一般来说,
systemDefault()
时区不是您想要的。相反,调用者应该提供他们期望的时区。如果您的程序在本地运行并且只需要您的计算机