Звучит как простое задание.
Получите значение метки времени 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;
Но я склонен думать, что где-то есть настоящий. И я надеюсь, что вы можете указать на это.