В PostgreSQL я создал таблицу, подобную этой:
create table myTable (
dateAdded timestamp(0) without time zone null default (current_timestamp at time zone 'UTC');
)
Я выбираю "без часового пояса", потому что знаю, что все временные метки, с которыми работает мое приложение, всегда являются UTC. Насколько я получил документацию, единственное отличие от "timestamp" заключается в том, что я могу предоставлять значения в других часовых поясах, которые затем будут преобразованы в UTC. Однако я хочу избежать таких автоматических преобразований, потому что они вряд ли могут принести пользу, если я знаю, что мои значения - это UTC.
Когда я добавляю новую запись в свою тестовую таблицу и просматриваю содержимое таблицы с помощью pgAdmin, я вижу, что дата вставки была правильно сохранена в формате UTC.
Однако, когда я пытаюсь выбрать значения, используя JDBC, значение получает 2 часа. Я нахожусь в UTC + 2, так что похоже, что JDBC предполагает, что дата в таблице не является меткой времени UTC, а UTC + 2 timestamp вместо этого и пытается конвертировать в UTC.
Некоторые поисковые запросы показали, что стандарт JDBC диктует что-то о преобразовании в/из текущего часового пояса, но это можно предотвратить, предоставив Calander для вызова getTimestamp/setTimestamp. Однако поставка календаря не имела никакого значения. Вот мой конвертер MyBatis/Jodatime:
@MappedTypes(DateTime.class)
public class DateTimeTypeHandler extends BaseTypeHandler<DateTime> {
private static final Calendar UTC_CALENDAR = Calendar.getInstance(DateTimeZone.UTC.toTimeZone());
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
DateTime parameter, JdbcType jdbcType) throws SQLException {
ps.setTimestamp(i, new Timestamp(parameter.getMillis()), UTC_CALENDAR);
}
@Override
public DateTime getNullableResult(ResultSet rs, String columnName)
throws SQLException {
return fromSQLTimestamp(rs.getTimestamp(columnName, UTC_CALENDAR));
}
/* further get methods with pretty much same content as above */
private static DateTime fromSQLTimestamp(final Timestamp ts) {
if (ts == null) {
return null;
}
return new DateTime(ts.getTime(), DateTimeZone.UTC);
}
}
Какой правильный способ получить временные метки UTC из источника времени JDBC + PostgreSQL?