Как мне извлечь значение эпохи Long
из экземпляров LocalDateTime
или LocalDate
? Я пробовал следующее, но это дает другие результаты:
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives 71461
System.out.println(time.getLong(ChronoField.EPOCH_DAY)); // gives 16105
Я хочу просто значение 1391539861
для локального datetime "04.02.2014 19:51:01"
. Мой часовой пояс - Europe/Oslo
UTC + 1 с переходом на летнее время.
LocalDateTime
чем вычислить ее вручную?Ответы:
Классы
LocalDate
иLocalDateTime
не содержат информации о часовом поясе или смещении времени и секундах с начала эпохи без этой информации. Однако у объектов есть несколько методов для преобразования их в объекты даты / времени с часовыми поясами путем передачиZoneId
экземпляра.LocalDate
LocalDateTime
источник
ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))
long epoch = time.toEpochSecond(ZoneOffset.UTC)
для случаев UTC, или когда вы уже знаете часовой пояс, илиlong epoch = time.toEpochSecond(ZoneId.systemDefault());
если вы хотите пойти по этому маршруту.Instant.ofEpochMilli(responseTime).atZone(ZoneId.systemDefault()).toLocalTime()
«Миллис с эпохи unix» представляет собой мгновение, поэтому вам следует использовать класс Instant:
источник
ZoneId.systemDefault()
потому что эпоха unix относится к UTCТребуемое преобразование требует смещения от UTC / Greewich или часового пояса.
Если у вас есть смещение, есть специальный метод на
LocalDateTime
для решения этой задачи:Если у вас есть только
ZoneId
то вы можете получить егоZoneOffset
изZoneId
:Но вы можете найти преобразование
ZonedDateTime
проще:источник
long epochSec = localDateTime.toEpochSecond(ZoneOffset.UTC);
Посмотрите на этот метод, чтобы узнать, какие поля поддерживаются. Вы найдете для
LocalDateTime
:Поле INSTANT_SECONDS, конечно, не поддерживается, потому что a
LocalDateTime
не может ссылаться ни на какую абсолютную (глобальную) метку времени. Но что полезно, так это поле EPOCH_DAY, которое подсчитывает количество дней, прошедших с 01.01.1970. Подобные мысли справедливы и для типаLocalDate
(с еще менее поддерживаемыми полями).Если вы намереваетесь получить несуществующее поле millis-Since-unix-epoch, вам также понадобится часовой пояс для преобразования из локального в глобальный тип. Это преобразование можно сделать намного проще, см. Другие сообщения SO .
Возвращаясь к вашему вопросу и цифрам в вашем коде:
16105L * 86400 + 71461 = 1391543461 секунд с 1970-01-01T00: 00: 00 (внимание, без часового пояса) Затем вы можете вычесть смещение часового пояса (обратите внимание на возможное умножение на 1000, если оно в миллисекундах).
ОБНОВЛЕНИЕ после указанной информации о часовом поясе:
Как JSR-310-код с двумя эквивалентными подходами:
источник
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
а затемLong epoch = time.atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();
.Преобразование из удобочитаемой даты в эпоху :
Преобразование эпохи в удобочитаемую дату :
Для конвертера других языков: https://www.epochconverter.com
источник
Это один из способов без использования часового пояса:
источник