Я пытаюсь написать код для взаимодействия с независимой от сторонней разработки базой данных с использованием Java и MySQL. В этой базе данных есть поле, которое хранит метку времени в поле DATETIME
в качестве даты UTC. Часовой пояс для сервера, на котором запущены как база данных, так и клиент, настроен на не-UTC-зону (Europe/London
), поэтому по умолчанию отметка времени считывается неправильно, как если бы это было локальное время. Я пытаюсь написать код, чтобы прочитать его как UTC.
Я прочитал несколько подобных вопросов здесь, но у каждого из них нет ответа, который работает для меня:
- MySQL - как сохранить время с правильным часовым поясом? (из Java)
- Как сохранить java.util.Date в поле timestamp MySQL в часовой пояс UTC/GMT?
- Дата в UTC в mysql
- Как установить часовой пояс MySQL?
К сожалению, я не могу изменить настройки сервера, поэтому я попытался использовать переменную "time_zone" соединения, чтобы установить сервер базы данных на использование UTC и необязательный параметр Calendar
на ResultSet.getTimestamp
для получения даты, но это не влияет на результат. Вот мой код:
private static final Calendar UTCCALENDAR = Calendar.getInstance (TimeZone.getTimeZone (ZoneOffset.UTC));
public Date getDate ()
{
try (Connection c = dataSource.getConnection ();
PreparedStatement s = c
.prepareStatement ("select datefield from dbmail_datefield where physmessage_id=?"))
{
fixTimeZone (c);
s.setLong (1, getPhysId ());
try (ResultSet rs = s.executeQuery ())
{
if (!rs.next ()) return null;
return new Date (rs.getTimestamp(1,UTCCALENDAR).getTime ()); // do not use SQL timestamp object, as it fucks up comparisons!
}
}
catch (SQLException e)
{
throw new MailAccessException ("Error accessing dbmail database", e);
}
}
private void fixTimeZone (Connection c)
{
try (Statement s = c.createStatement ())
{
s.executeUpdate ("set time_zone='+00:00'");
}
catch (SQLException e)
{
throw new MailAccessException ("Unable to set SQL connection time zone to UTC", e);
}
}
В поле базы данных, которое я пытаюсь прочитать, есть значение, хранящееся в нем:
mysql> select * from dbmail_datefield where physmessage_id=494539;
+----------------+--------+---------------------+
| physmessage_id | id | datefield |
+----------------+--------+---------------------+
| 494539 | 494520 | 2015-04-16 10:30:30 |
+----------------+--------+---------------------+
Но, к сожалению, результат выдается как BST не UTC:
java.lang.AssertionError: expected:<Thu Apr 16 11:30:30 BST 2015> but was:<Thu Apr 16 10:30:30 BST 2015>