Вопрос или проблема
Я получил временной штамп в запросе в формате 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, вам следует следовать следующему примеру.
Шаги для преобразования целочисленного временного штампа:
-
Определите тип временного штампа: Убедитесь, что ваш временной штамп действительно представляет собой количество секунд, прошедших с начала эпохи Unix (1 января 1970 года). Например, штамп
1728962183
представляет количество секунд с указанного момента. -
Используйте класс
Instant
: В Java классInstant
предназначен для представления конкретного мгновения времени в UTC. Для преобразования целочисленного временного штампа в объектInstant
используйте методofEpochSecond
. -
Сравнение со значением
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. Каждый раз, когда вы работаете с временными данными, важно учитывать контекст и используемые классы, чтобы избежать ошибок и недоразумений.