2010-02-08 2 views
3

У меня есть код, вставляющий отметку времени в таблице Postgres. Вот определение поля, в котором вставляется метка времени:JDBC конвертирует даты в UTC

datelast timestamp without time zone 

Я использую этот Java код для обновления данных в поле:

PreparedStatement sqlStatement = connection.prepareStatement(
     "UPDATE datetest SET datelast = ? WHERE id = ? "); 
    sqlStatement.setTimestamp(1, new java.sql.Timestamp((new Date()).getTime())); 
    sqlStatement.setInt(2, 1); 
    sqlStatement.executeUpdate(); 

Моя проблема заключается в том, что он вставляет UTC метку вместо моя местная метка времени (восточное время). Поэтому, когда я проверяю данные в своей таблице, я вижу «2010-02-08 19: 07: 21.261» вместо «2010-02-08 14: 07: 21.261».

На самом деле, у меня был этот код, который я хотел бы использовать на старом сервере, но после переноса кода у меня возникла эта проблема. Проблема не в whit Postgres, потому что я все еще использую одну и ту же БД. Я также проверил часовой пояс ОС, и они те же. Я также попробовал «System.out.println (« TZ = »+ TimeZone.getDefault()); и я получаю тот же часовой пояс на обоих серверах. Поэтому я пришел к выводу, что драйвер JDBC конвертирует дату в UTC, прежде чем вставлять ее в таблицу.

Может ли кто-нибудь помочь мне разобраться, почему временная метка преобразована?

Благодаря

+0

Если ваша колонка специально «без часового пояса», вы хотите, чтобы все даты сохранялись в Universal Time, чтобы у вас была постоянная контрольная точка? –

+0

См. Ответ на соответствующий вопрос по адресу http://stackoverflow.com/questions/508019/jpa-hibernate-store-date-in-utc-time-zone/3430957#3430957. –

ответ

1

моя проблема была связана с файлом JAR для Postgres.

На моем старом сервере я использовал файл Postgres 7 JAR, и все работало хорошо. По какой-то причине он больше не работал на моем новом сервере. Я заменил файл JAR на Postgres 8, и теперь все работает хорошо. Когда я вставляю временную метку в БД, она теперь вставляет мое местное время, а не GMT.

Спасибо всем за помощь.

1

Когда вы говорите «проверить данные в моей таблице» Я полагаю, вы используете какой-то инструмент базы данных, просмотра? Это поможет узнать, как вы получаете эти ценности.

Меня не удивит, если вы обнаружите, что ваша база данных хранит значения внутри себя как UTC. Тогда будет программное обеспечение, которое извлекает данные для отображения в выбранной временной зоне. На самом деле я не ожидал бы, что он сохранит данные внутренне как что-то, зависящее от часовой пояс по умолчанию на сервере базы данных, потому что тогда изменение этой часовой пояс по умолчанию (или перемещение базы данных на другой сервер с другим значением по умолчанию) изменит все данные. Это было бы плохо.

+0

Я использую интерфейс командной строки «psql», и я делаю простой «select * from datetest» – MaxP

2

Как отмечает Пол Клэпхем, postgres does indeed always store timestamp values in UTC:

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

Когда выдается временная метка с указанием часового пояса, она всегда преобразуется из UTC в текущую зону часового пояса и отображается как местное время в этой зоне. Чтобы увидеть время в другом часовом поясе, измените часовой пояс или используйте конструкцию AT TIME ZONE (см. Раздел 9.9.3).

Этот раздел руководства имеет в виду timestamp with timezone но можно предположить, что то же самое внутреннее хранение относится к without timezone

+0

Это очень интересно, но это не объясняет мне, почему он в настоящее время работает корректно с моего старого сервера, а не с моего нового ... есть ли что-то, что я должен добавить в свой Java-код, чтобы он работал так, как раньше? – MaxP

Смежные вопросы