Эпоха в миллисекундах в UT C
Не существует такой вещи, как «toEpochMilli в конкретном c часовом поясе», если вы следуете традиционным определениям. Подсчет миллисекунд от эпохи всегда равен UT C.
Подсчет миллисекунд от эпохи выполняется в UT C. Ссылка эпохи, используемая java .time и Unix / POSIX, - это первый момент 1970 в UT C, 1970-01-01T00: 00Z. Z
на конце означает UT C и произносится как «зулусский». Ежедневно в различных информационных системах используются десятки других ссылок на эпохи.
Так что нет смысла говорить «эпоха милли в часовом поясе».
Если у вас есть количество миллисекунды с первого момента 1970 года в UT C, проанализировать как Instant
.
Instant instant = Instant.ofEpochMilli( milliseconds ) ;
Чтобы увидеть тот же самый момент через время настенных часов, используемое людьми из указанного региона c , настройте часовой пояс, чтобы получить ZonedDateTime
.
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Instant
и ZonedDateTime
оба представляют один и тот же одновременный момент , одну и ту же точку на временной шкале , такое же количество миллисекунд с момента ссылки на эпоху.
Вы можете извлечь Instant
из ZonedDateTime
, чтобы вернуться к исходному отсчету от эпохи.
long millisecondsSinceEpoch = zdt.toInstant().toEpochMilli() ;
Вы обнаружит, что длинные целые числа milliseconds
и millisecondsSinceEpoch
- это одно и то же число.
Ваш код instant.atZone(zoneId).toInstant()
не имеет смысла. Вы начинаете с Instant
, конвертируете в ZonedDateTime
, а затем конвертируете обратно в Instant
. Все три объекта представляют один и тот же момент, одно и то же количество миллисекунд с момента ссылки на эпоху. Эти ваши звонки не принесли sh никакой полезной работы.
Время по Германии до UT C
При дальнейших разъяснениях вы сказали:
I требуется местное немецкое время в UT C отметка времени
Укажите свой часовой пояс c.
ZoneId z = ZoneId.of( "Europe/Berlin" ) ;
Сохраните текущий момент, как он там виден. *
Настройте на UT C, извлекая Instant
.
Instant instant = zdt.toInstant() ;
Опросите количество миллисекунд, если это абсолютно необходимо.
long milliseconds = instant.toEpochMilli() ; // Beware of data loss, as any microseconds/nanoseconds are ignored.
Да не рекомендовать передавать моменты в виде отсчета от эпохи, поскольку разрешение (миллисекунды против целых секунд против микросекунд против наносекунд против чего-то еще) неочевидно, равно как и ссылка на эпоху не очевидна. Вместо этого передавайте моменты в виде текста в стандартном формате ISO 8601 . Классы java .time по умолчанию используют форматы ISO 8601 при генерации / анализе текста. Поэтому нет необходимости указывать шаблон форматирования.
Если вам нужны только миллисекунды, усеките все существующие микросекунды или наносекунды.
String output = instant.truncatedTo( ChronoUnit.MILLIS ).toString() ; // Generate text in standard ISO 8601 format.
См. Этот код, запускаемый в реальном времени на IdeOne.com .
zdt.toString (): 2020-05-09T23: 57: 35.363701 + 02: 00 [Европа / Берлин]
Instant.toString (): 2020- 05-09T21: 57: 35.363701Z
миллисекунды: 1589061455363
вывод: 2020-05-09T21: 57: 35.363Z
Таблица типов даты и времени в Java, как современных, так и устаревших