Создать метку времени без часового пояса - PullRequest
6 голосов
/ 28 декабря 2011

Как я могу создать java.sql.timestamp без часового пояса (я получаю 2007-09-23T10:10:10Z и я притворяюсь 2007-09-23T10:10:10).

Я пытаюсь:

Timestamp timestamp = Timestamp.valueOf("2007-09-23 10:10:10");

, но в отладкея видел, что cdate 2007-09-23T10:10:10.000+0100 вместо 2007-09-23T10:10:10

Ответы [ 2 ]

13 голосов
/ 28 декабря 2011

Метка времени не имеет часового пояса. Когда вы отображаете метку времени в виде строки, она отображает время и упоминает часовой пояс, потому что иначе вы не можете знать, какое время оно представляет. И он выбирает использовать часовой пояс по умолчанию (ваш), потому что это тот, который вам наиболее знаком.

Сказать, что 12:00:00 ничего не значит. Сказать, что это 12:00:00 в вашем часовом поясе, значит что-то. Но отметка времени содержит только мгновение во времени. Вы можете отобразить этот момент времени в любом часовом поясе, который вы хотите, используя DateFormat.

Примечание: Timestamp.valueOf("2010-10-23 12:05:16"); означает «создать метку времени с заданным временем в часовом поясе по умолчанию ».

1 голос
/ 22 ноября 2018

ТЛ; др

… могу ли я создать java.sql.timestamp без часового пояса…

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

Подробнее

A java.sql.Timestamp - неправильный класс для использования. Он представляет собой момент в UTC с разрешением наносекунд.

Если вам нужна дата с указанием времени суток независимо от часового пояса или смещения от UTC (например, , а не мгновение), используйте другой класс, который подходит для этой цели.

Кстати ... java.sql.Timestamp - ужасный старый класс, плохо спроектированный, и был вытеснен несколько лет назад классом java.time.Instant (всегда в UTC) или, альтернативно, java.time.OffsetDateTime, если установлено смещение UTC.

LocalDateTime

Подходящий класс для даты с временем суток без какой-либо концепции часового пояса или смещения от UTC составляет LocalDateTime.

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

TIMESTAMP WITHOUT TIME ZONE

В базе данных, соответствующей стандарту SQL, такой как Postgres , используйте столбец с типом данных TIMESTAMP WITHOUT TIME ZONE (не тип WITH).

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

И ...

myPreparedStatement.setObject( … , ldt ) ;

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

...