Это звучит как простая задача.
Получить значение метки времени в формате UTC из БД и передать его как дату в формате UTC через веб-службу.
У нас есть столбец с меткой времени DATE_COLUMN и мы храним время в часовом поясе UTC.
С JPA мы получаем на этот раз с
@Column(name = "DATE_COLUMN")
private java.sql.Timestamp dateValue;
И поскольку мы должны передать это время через веб-службу в формате UTC (Jax-ws 2.0), у нас есть методы getDate и setDate.
Мы заинтересованы в getDate.
public Calendar getDate()
{
Calendar calendar = Calendar.getInstance(utcTimeZone);
calendar.setTimeInMillis(dateValue.getTime());
return calendar;
}
Это не работает так, как вы могли подумать.
И это потому, что часовой пояс приложения по умолчанию отличается от UTC.
Вот пример для пояснения.
Значение в DATE_COLUMN равно «30.11.09 16: 34: 48,833045000», когда я перевожу его в UTC, я получаю «2009-11-30T14: 34: 48.833Z».
Разница 2 часа. И это потому, что мой часовой пояс по умолчанию - «Европа / Хельсинки».
Та же проблема, если вы просто хотите сопоставить DATE_COLUMN с Calendar
@Column(name = "DATE_COLUMN")
@Temporal(TemporalType.TIMESTAMP)
private Calendar dateValue;
public Calendar getDate()
{
calendar.setTimeZone(utcTimeZone);
return calendar;
}
Я не хочу менять часовой пояс приложения, потому что это не похоже на решение.
На данный момент у нас есть только два варианта.
Первый. Вычислите смещение между часовым поясом приложения и UTC и добавьте его вручную после автоматического вычитания в calendar.setTimeZone.
public Calendar getDate()
{
Calendar calendar = Calendar.getInstance(utcTimeZone);
calendar.setTimeInMillis(dateValue.getTime());
int offset = TimeZone.getDefault().getOffset(dateValue.getTime());
calendar.add(Calendar.MILLISECOND, offset);
return calendar;
}
Второй. Передайте dateValue как Long
через веб-службу. Что неплохо, кроме того, что мы теряем реальный тип поля в wsdl.
Мое воображаемое решение
@Column(name = "DATE_COLUMN")
@Temporal(type = TemporalType.TIMESTAMP, timezone = 'UTC')
private Calendar dateValue;
Но я склонен думать, что где-то есть настоящий. И я надеюсь, ты сможешь указать на это.