Как преобразовать МГНОВЕННОЕ время UT C в EpochMilli в c timeZone - PullRequest
0 голосов
/ 09 мая 2020

Изменить: извините, возможно, мой вопрос был неправильным ....

Я пытаюсь преобразовать метку времени UT C в локальную метку времени в Java (Kotlin)

f. пример.

UT C время 18:00 Местное время Германии: 20:00 Мне нужно местное время Германии в UT C метка времени .....

    fun getLocalizedTime(locationId: Long, utcTimeInMs: Long? ): Long{
        val instant = Instant.ofEpochMilli(utcTimeInMs?:Instant.now().toEpochMilli())
        val zoneIdAsString = locationDataService.locationData.locations[locationId]?.timeZone
                ?: "UTC"
        val zoneId = ZoneId.of(zoneIdAsString)
        val zonedDateTime = ZonedDateTime.ofInstant(instant, zoneId)

        return instant.atZone(zoneId).toInstant().toEpochMilli()
    }
}

возвращает UT C время: (

Как преобразовать МГНОВЕННОЕ время UT C в EpochMilli в указанном c часовом поясе

1 Ответ

2 голосов
/ 09 мая 2020

Эпоха в миллисекундах в 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, как современных, так и устаревших

...