как преобразовать временную метку Java в строку, относящуюся к часовому поясу с наносекундным разрешением - PullRequest
1 голос
/ 05 июля 2019

Я хочу преобразовать метку времени в строку с заданным аргументом часового пояса (в Java).Из кода, который я смотрю внутри, отметка времени имеет наносекундную точность (или, по крайней мере, одну можно преобразовать в наносекунды, и мне все равно, поскольку формат вывода, который я хочу сгенерировать, не так точен).

DateFormat разрешает спецификатор S и будет применять TimeZone, но, похоже, он имеет точность только 3 цифры (миллисекунды?).Использование toString дает 6 цифр точности в течение секунд (микросекунд?), Но, похоже, не принимает аргумента TimeZone.

Мне нужно что-то, что делает оба, позволяет спецификатор TimeZone и дает 6 цифр точности в пределахвторой.

Что использовать?

1 Ответ

0 голосов
/ 10 июля 2019

Я предполагаю, что вы имеете в виду java.sql.Timestamp, который вы получаете из базы данных SQL, где это была временная метка с часовым поясом или без него.

Использовать java.time

Во-первых, вам это не нужно. Класс Timestamp плохо спроектирован и давно устарел. Вместо этого предпочитайте получать из вашей базы данных:

  • Если столбцом вашей базы данных является timestamp with time zone, что и должно быть, то получите OffsetDateTime (с некоторыми драйверами JDBC Instant тоже работает).
  • Если столбец вашей базы данных timestamp без часового пояса (не рекомендуется), тогда получите LocalDateTime. Проблема в том, что LocalDateTime - это дата и время без часового пояса, поэтому не является уникальным моментом времени, поэтому не подходит для отметки времени.

Все упомянутые типы взяты из java.time, современного Java-API даты и времени, и все они имеют точность наносекунды.

* * 1 022 Пример: * 1 023 *
    OffsetDateTime odt = yourResultSet.getObject("my_timestamp_col", OffsetDateTime.class);
    System.out.println(odt);

Пример вывода:

2018-11-29T22: 34: 56.123456789Z

Трейлинг Z на выходе означает часовой пояс Зулу, UTC или смещение нуля.

Вы хотели применить данный часовой пояс. Так, например:

    ZonedDateTime zdt = odt.atZoneSameInstant(ZoneId.of("America/Guyana"));
    System.out.println(zdt);

2018-11-29T18: 34: 56.123456789-04: 00 [Америка / Гайана]

Для получения типа из java.time из набора результатов с использованием ResultSet.getObject требуется JDBC 4.2 (или современная реализация JPA или то, что вы используете для доступа к данным). У большинства из нас это есть.

Обработка метки времени из устаревшего API

В случае, если вы либо еще не получили JDBC 4.2, либо получаете Timestamp от устаревшего API, который вы не можете себе позволить изменить прямо сейчас:

    ZonedDateTime zdt = yourTimestamp.toInstant()
            .atZone(ZoneId.of("America/Guyana"));

Если у вас есть особые требования к выводу строки, используйте DateTimeFormatter для форматирования ZonedDateTime. Это описано во многих местах, просто поиск.

Link

Обучающее руководство по Oracle: Дата и время , объясняющее, как использовать java.time.

...