Как конвертировать целочисленный штамп времени в формат даты и сравнить с LocalDateTime.now? [дубликат]

Вопрос или проблема

Я получил временной штамп в запросе в формате Integer

target_time = 1728962183

Затем я хочу использовать его для сравнения с LocalDateTime.now(), чтобы решить, как будет работать код.

Пример:

if(target_time < LocalDateTime.now()) {
   // выполнить некоторые действия
}

Как мне преобразовать временной штамп Integer в формат даты?

коротко

Instant
.ofEpochSecond ( 1_728_962_183L )
.isBefore( Instant.now() )

Ссылка на эпоху

Если вы знаете, что это число – количество полных секунд с эпохи первого момента 1970 года по UTC (1970-01-01T00:00Z), тогда преобразуйте в Instant.

Instant

long count = 1_728_962_183L;
Instant instant = Instant.ofEpochSecond ( count );

instant.toString() = 2024-10-15T03:16:23Z

Сравните с текущим моментом, чтобы узнать, прошел ли этот момент.

boolean isPast = instant.isBefore( Instant.now() ) ;

LocalDateTime – это неправильный класс

Вы спросили:

сравнить с LocalDateTime.now(

Класс LocalDateTime представляет дату с временем суток, но не имеет контекста часового пояса или смещения от UTC. Без этого контекста дата с временем становится неоднозначной. Мы не знаем, была ли это дата и время в Токио, Япония, или в Тулузе, Франция, или в Толедо, Огайо, США – это три совершенно разных момента, несколько часов в разнице.

Поэтому класс LocalDateTime не может представлять момент, не является точкой на временной линии. Нет смысла сравнивать LocalDateTime с моментом.

Представление момента

java.time представляют момент. Они предоставляют три разных способа взглянуть на момент.

  • Instant
    Момент, рассматриваемый по UTC, то есть с нулевым смещением в часах-минутках-сеундах от временного меридиана UTC. Этот класс является основным строительным блоком фреймворка java.time.
  • OffsetDateTime
    Момент, рассматриваемый через смещение, какое-то количество часов-минут-секунд вперед или назад от временного меридиана UTC.
  • ZonedDateTime
    Момент, рассматриваемый через конкретный часовой пояс.

Смещение – это просто количество часов-минут-секунд. Часовой пояс – это гораздо больше. Часовой пояс – это названная история прошлых, настоящих и будущих изменений в смещении, используемом людьми конкретного региона, как решено их политиками.

Ответ или решение

Для преобразования целочисленного временного штампа в формат даты и сравнения его с текущим временем, используя Java, вам следует следовать следующему примеру.

Шаги для преобразования целочисленного временного штампа:

  1. Определите тип временного штампа: Убедитесь, что ваш временной штамп действительно представляет собой количество секунд, прошедших с начала эпохи Unix (1 января 1970 года). Например, штамп 1728962183 представляет количество секунд с указанного момента.

  2. Используйте класс Instant: В Java класс Instant предназначен для представления конкретного мгновения времени в UTC. Для преобразования целочисленного временного штампа в объект Instant используйте метод ofEpochSecond.

  3. Сравнение со значением Instant.now(): Чтобы сделать сравнение со текущим моментом, вы можете использовать метод isBefore из класса Instant.

Пример реализации:

import java.time.Instant;

public class TimestampComparison {
    public static void main(String[] args) {
        // Ваш целочисленный временной штамп
        int target_time = 1728962183;

        // Преобразуем целочисленный временной штамп в long
        long targetTimeLong = (long) target_time;

        // Преобразуем его в объект Instant
        Instant targetInstant = Instant.ofEpochSecond(targetTimeLong);

        // Получаем текущее время в формате Instant
        Instant currentInstant = Instant.now();

        // Сравниваем временные штампы
        if (targetInstant.isBefore(currentInstant)) {
            System.out.println("Целочисленный временной штамп меньше текущего времени.");
            // Выполните необходимые действия здесь
        } else {
            System.out.println("Целочисленный временной штамп больше или равен текущему времени.");
        }
    }
}

Примечания:

  • LocalDateTime не рекомендуется для сравнения: Обратите внимание, что использование LocalDateTime в этом случае может быть неверным. LocalDateTime не содержит информации о временной зоне и не может представлять мгновение на линии времени, поэтому лучше всего использовать Instant, который узнает о времени в UTC.

  • Понимание временных классов: В Java существуют три основных класса для представления моментов времени:

    • Instant: для отображения моментов в UTC.
    • OffsetDateTime: для часового смещения от UTC.
    • ZonedDateTime: для представления времени с учетом конкретной временной зоны.

Заключение:

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

Оцените материал
Добавить комментарий

Капча загружается...