метка времени в формате Java в формате UTC - PullRequest
0 голосов
/ 04 января 2019

Я использую следующий код для получения текущего системного времени, которое необходимо было передать некоторым запросам sql

java.util.Date date = new java.util.Date();
long t = date.getTime();
java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(t);

log.info("Current Time:" + sqlTimestamp.toString());

Теперь мне также нужно было получить время UTC 0 (не GMT ​​0)

log.info («Текущее время:» + sqlTimestamp.toString ());

Текущее время: 2019-01-04 15: 04: 50,735

Iя пытаюсь использовать следующий код, но похоже, что часть даты не отображается правильно

 log.info("Current UTC Time:" + new java.sql.Timestamp(Instant.now().atOffset( ZoneOffset.UTC ).toEpochSecond()).toString());

Текущее время UTC: 1970-01-19 02: 36: 36.299

Пожалуйста, дайтея знаю, какая коррекция мне нужна

Ответы [ 4 ]

0 голосов
/ 04 января 2019

Почему вы не можете использовать DateTimeFormatter

sqlTimestamp.toInstant().atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS"))
0 голосов
/ 04 января 2019

ТЛ; др

Вместо этого используйте современные java.time классы.

Instant
.now()
.toString()

2019-01-23T01: 23: 45.123456789Z

java.time

Вы используете ужасные старые классы даты и времени, которые были полностью вытеснены несколько лет назад классами java.time .

Захват текущего момента.

Instant instant = Instant.now() ;

Создание текста для представления этого момента в стандартном формате ISO 8601.

String output = instant.toString() ;

Если T в середине вас беспокоит, замените его. Но я призываю вас придерживаться строгого формата ISO 8601 для ведения журнала.

String outputModified = output.replace( "T" , " " ) ;

время UTC 0 (не GMT ​​0)

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

0 голосов
/ 04 января 2019

Сначала избегайте занятий Date и Timestamp.Вместо Timestamp передайте современный тип из java.time в ваш запрос SQL.В зависимости от деталей вашего драйвера JDBC и требований вашего запроса используйте Instant, OffsetDateTime со смещением UTC (ноль) или LocalDateTime.

Date и Timestampклассы имеют проблемы с дизайном и давно устарели.Класс Timestamp может быть очень запутанным, и, похоже, нет единого мнения о том, следует ли его интерпретировать как метку времени (как следует из названия) или как дату и время дня.К счастью, начиная с JDBC 4.2 вам больше не нужен Timestamp.

Например:

    OffsetDateTime currentUtcTime = OffsetDateTime.now(ZoneOffset.UTC);
    PreparedStatement ps = con.prepareStatement(
            "select col1 from your_table where your_timestamp > ?;");
    ps.setObject(1, currentUtcTime);
    ResultSet rs = ps.executeQuery();
0 голосов
/ 04 января 2019

Вы используете toEpochSecond() вместо toEpochMilli()

Javadoc для вашего Timestamp конструктора

Отметка времени (длительное время) Создает объект отметки времени, используя миллисекунды значение времени.

Так что вы можете использовать Instant.now().toEpochMilli(), так как Instant.now() вернет вам Instant в UTC

(И, конечно, по возможности избегайте использования старого API даты, используйте новый API даты из JDK8)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...