Получение разных значений для Timestamp.valueOf - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь получить значение метки времени для 2018-09-04 13: 43: 32.922000, выполнив Timestamp.valueOf("2018-09-04 13:43:32.922000")

ожидаемый результат - 2018-09-04 13: 43: 32.922

но я получаю 2018-09-04 01: 13: 32.922

Это может быть из-за разного часового пояса, потому что моя команда в Индии получила точный результат, но я здесь, в Калифорнии, получил другой результат. Предложите изменения, которые могут решить эту проблему.

Ответы [ 2 ]

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

ТЛ; др

myPreparedStatement.setObject( 
    Instant
    .parse( 
        "2018-09-04 13:43:32.922000"
        .replace( " " , "T" )
        .concat( "Z" )  
    ) 
    .atZone(
        ZoneOffset.UTC
    )
)

java.time

Предложите изменения, которые могут решить эту проблему.

Никогда не используйте java.sql.Timestamp.

Среди многих недостатков этого класса является то, что метод , который вы вызываете, не документирован , чтобы объяснить его поведение при разборе. Похоже, что текущий часовой пояс вашего JVM по умолчанию применяется без каких-либо настроек. Но проблема спорная.

Этот ужасно разработанный класс был вытеснен несколько лет назад современными java.time классами с принятием JSR 310, в частности Instant и OffsetDateTime.

Измените входную строку на стандартный ISO 8601 формат, заменив ПРОБЕЛ в середине на T.

String input = "2018-09-04 13:43:32.922000".replace( " " , "T" ) ;

Ваш вход был предназначен для представления момента в UTC , смещения нуля? Если это так, добавьте Z (произносится Зулу).

String input = "2018-09-04 13:43:32.922000".replace( " " , "T" ).concat( "Z" ) ;

Класс Instant представляет момент в UTC, всегда в UTC по определению.

Instant instant = Instant.parse( input ) ;

Ваш драйвер JDBC может дополнительно принимать Instant объект.

myPreparedStatement.setObject( instant ) ;

Если ваш драйвер JDBC не поддерживает Instant, используйте OffsetDateTime. Поддержка требуется в JDBC 4.2 и более поздних версиях.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ; 
myPreparedStatement.setObject( odt ) ;

Обратите внимание, что текущий часовой пояс JVM по умолчанию во время выполнения не имеет значения, не влияя на приведенный выше код.


О 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 и more .

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

Не думаю, что проблема в разных часовых поясах. Просто вывод, который вы получаете, находится в 24-часовом формате, и его необходимо преобразовать в 12-часовой формат. См. Как преобразовать 24-часовое время в 12-часовой формат? Чтобы преобразовать время в 12-часовой формат.

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