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()
时区不是您想要的。相反,调用者应该提供他们期望的时区。如果您的程序在本地运行并且只需要您的计算机