首页 > 解决方案 > 我们如何决定是使用 ZonedDateTime 还是 LocalDateTime?

问题描述

有时,当我们想解决某些日期/时间问题时,我们很难判断是否使用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;
    }
}

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

我总觉得ZonedDateTimeLocalDateTime. 能做到的事LocalDateTime,也能做到ZonedDateTime,反之不行。因此,如果我坚持选择哪个,我会ZonedDateTime默认选择。这是一个正确的概念吗?

标签: java

解决方案


而不是使用System.currentTimeMillis()useZonedDateTime.now(ZoneId)Instant.now(). currentTimeMillis()在现代 Java 中你几乎不需要。在整个应用程序中使用专用java.timeAPI,这样您就可以使用类型良好的数据结构,而不是像long currentTimeMillis.


给定一个纪元,我们想知道星期几

值得承认的是,如果没有时区,这不是一个有意义的问题。在任何时候,地球上不同的地方都有两天(或更多?)天。所以在我们走得更远之前,我们需要问一下你关心哪个时区?

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

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


推荐阅读