Как мы можем решить, использовать ли ZonedDateTime или LocalDateTime? - PullRequest
0 голосов
/ 27 мая 2020

Иногда нам трудно принять решение, использовать ли ZonedDateTime или LocalDateTime, когда мы хотим решить определенную проблему даты / времени.

Например, для данной эпохи мы хотел бы знать день недели.

Мы обнаруживаем, что можем выполнить sh эту задачу с помощью 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, но не наоборот. Следовательно, если я застрял в выборе, я буду использовать по умолчанию от go до ZonedDateTime. Это правильная концепция?

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Вместо System.currentTimeMillis() используйте ZonedDateTime.now(ZoneId) или Instant.now(). Вам почти никогда не понадобится currentTimeMillis() в современном Java. Используйте выделенные java.time API-интерфейсы во всем приложении, чтобы вы работали с хорошо типизированными структурами данных вместо примитивов, таких как long currentTimeMillis.

учитывая эпоху, мы хотели бы знать день недели

Стоит признать, что это несущественный вопрос без часового пояса; в любой момент времени есть два (или более?) дня недели в разных местах на земле. Итак, прежде чем мы продолжим go, нам нужно спросить , какой часовой пояс (ы) вас интересует?

Вообще говоря, часовой пояс systemDefault() не то, что ты хочешь. Вместо этого вызывающий должен указать ожидаемый часовой пояс. Если ваша программа работает локально и когда-либо нуждается только в часах вашего компьютера, это может быть хорошо, но сама причина разделения между LocalDateTime и ZonedDateTime заключается в том, что система очень часто не соответствует правильному часовому поясу для использования.

Для тривиальных случаев, например, для процесса Java, запущенного на вашем локальном компьютере, который не заботится об изменении часового пояса с течением времени, вы можете правильно использовать системный часовой пояс. Но в таких случаях рекомендуется запросить систему рядом с вашим методом main(), а затем передать эту зону через ваше приложение. Это делает приложение более масштабируемым и тестируемым, если системная зона перестает быть правильным подходом в будущем.

1 голос
/ 27 мая 2020

Нужно ли вам хранить данные времени, привязанные к указанному c часовому поясу, или вам нужно обрабатывать данные времени, которые имеют связанное смещение?

Если вы делаете используйте ZonedDateTime.

Если вы не , используйте LocalDateTime.

Некоторые примеры, когда я хотел бы использовать ZonedDateTime:

  • Я анализирую временную метку ISO 8601 с информацией о зоне.
  • Я просматриваю данные из двух разных источников, расположенных в двух физически разных местах.
  • I Я пытаюсь вычислить, какой день недели имеет метку времени.

Некоторые примеры того, когда я хотел бы использовать LocalDateTime:

  • Я уверен, что моей системе нужно заботиться только об одном часовом поясе - моем.
  • Данные, которые я анализирую, не содержат информации о времени.
  • Я хочу знать, сколько секунд прошло между двумя отметками времени. Это может сначала преобразоваться в ZonedDateTime, прежде чем оно в конечном итоге декантируется в Duration, если метки времени находятся в формате ISO 8601.

Определенно будьте осторожны с днями недели в разных часовых поясах, поскольку международная линия дат может смещать день недели в зависимости от вашего физического местоположения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...