Java: преобразование длинной метки времени + смещение int в читаемый формат - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь преобразовать отметку времени Long со смещением (int) в более читаемый формат. Так, например, у меня есть 1514564669355 как отметка времени со смещением, равным 360. Как мне преобразовать это в эквивалентный формат даты, используя Java?

В этом случае временная метка будет храниться в UTC, поэтому с учетом смещения я собираюсь преобразовать ее в любой часовой пояс, в котором она нуждается. Спасибо за любую помощь / советы.

1 Ответ

0 голосов
/ 09 мая 2018

Ваш вопрос не ясен.

  • Возможно, вы имеете в виду, что у вас есть значение в UTC и вы хотите настроить его на смещение на 360 минут до UTC. (Плохой способ общения на мгновение.)
  • Или, возможно, вы имели в виду, что данное значение уже опережает UTC. (Еще худший способ общения на мгновение.)

Начиная с UTC

Сначала проанализируйте ваш введенный номер. Предположим, что число - это число в миллисекундах с первого момента 1970 UTC, 1970-01-01T00: 00Z.

Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичного знака). доля).

Instant instant = Instant.ofEpochMilli( 1_514_564_669_355L ) ;

instant.toString (): 2017-12-29T16: 24: 29,355Z

смещение от UTC - это количество часов, минут и секунд до или после UTC .

Возможно, в вашем вопросе упоминание о смещении 360 подразумевается на 360 минут или на 6 часов раньше UTC.

Класс ZoneOffset не может быть создан из числа минут свыше 59. Поэтому мы конвертируем из 360 минут в общее количество секунд.

int seconds = ( int ) TimeUnit.MINUTES.toSeconds( 360L ) ;  // Convert minutes to seconds.
ZoneOffset offset = ZoneOffset.ofTotalSeconds( seconds );   // Determine offset-from-UTC.

offset.toString (): +06: 00

Отрегулируйте Instant в UTC до этого смещения, получив объект OffsetDateTime. Тот же самый момент, та же самая точка на временной шкале, другое время настенных часов. Таким образом, время дня рассматривается как 22:00, а не как 16:00, поскольку (16 + 6) = 22.

    OffsetDateTime odt = instant.atOffset( offset );

odt.toString (): 2017-12-29T22: 24: 29,355 + 06: 00

Начиная со смещения

Возможно, вы имели в виду, что передаваемый момент - это количество миллисекунд от UTC, но затем число миллисекунд в 360 минутах уже было добавлено или вычтено.

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

Давайте отменим сложение / вычитание смещения, чтобы вернуться в UTC.

long millisInOffset = TimeUnit.MINUTES.toMillis( 360L );  // Convert minutes to milliseconds.
long millisSinceEpoch = ( 1_514_564_669_355L - millisInOffset );
Instant instant = Instant.ofEpochMilli( millisSinceEpoch );

instant.toString (): 2017-12-29T10: 24: 29,355Z

См. Это значение в смещении, отправленном нам.

int seconds = ( int ) TimeUnit.MILLISECONDS.toSeconds( millisInOffset );
ZoneOffset offset = ZoneOffset.ofTotalSeconds( seconds );
OffsetDateTime odt = instant.atOffset( offset );
System.out.println( odt );

2017-12-29T16: 24: 29,355 + 06: 00


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые унаследованные классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и еще .

...