PostgreSQL PreparedStatement.setTimestamp вопрос - PullRequest
2 голосов
/ 06 июля 2011

Этот проект, который у меня есть, использует базу данных MySQL. Но сейчас я хочу перейти на PostgreSQL. Все работает отлично, за исключением одной таблицы, в которой есть столбец типа timestamp.

//MedName is varchar, and DateTime is timestamp
String INSERT_REFILL = "INSERT INTO refill (MedName, DateTime) VALUES (?, ?)";
PreparedStatement ps = conn.prepareStatement(INSERT_REFILL);
ps.setString(1, "Tylenol");
java.sql.Timestamp  sqlDate = new java.sql.Timestamp(new java.util.Date().getTime());
TimeZone tz = TimeZone.getTimeZone("GMT");
GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance(tz);
ps.setTimestamp(2, sqlDate, cal);

Мой вопрос: по какой-то причине setTimestamp всегда добавляет 5 часов к значениям PreparedStatement. Я нахожусь в центре, поэтому мое время будет хх: хх: хх-0500 (центральное) из-за перехода на летнее время. Но я действительно сомневаюсь, что +5 часов приходит от этого. Есть идеи?

Примечание: я не тот, кто настраивал базу данных PostgreSQL, но я создал таблицу.

1 Ответ

2 голосов
/ 06 июля 2011

Как вы говорите, центральное время США сейчас на 5 часов раньше UTC.(Это 6 часов до UTC в летнее время).

Итак, у вас проблема с преобразованием часового пояса.Похоже, вы обрабатываете метку времени в UTC, как если бы она была в вашем местном времени.

Вам нужно определить, в каком часовом поясе находятся ваши входные значения, а затем ввести их соответственно в Postgres.

Также возможно, что Postgres правильно выполняет преобразование для вас, а вы просто неправильно читаете данные.Возможно, преобразование из локального в UTC выполняется точно так, как должно, и в этом случае вам просто нужно преобразовать из UTC в местное время, когда вы извлекаете данные для отображения.

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