Как сохранить дату и время в формате UTC в базе данных, используя EclipseLink и Joda-Time?
Я возился со следующим EclipseLinkJoda времени Конвертер долго хранить дату-время вуниверсальное глобальное время в базу данных MySQL без успеха вообще.
import java.util.Date;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.converters.Converter;
import org.eclipse.persistence.sessions.Session;
import org.joda.time.DateTime;
public final class JodaDateTimeConverter implements Converter {
private static final long serialVersionUID = 1L;
@Override
public Object convertObjectValueToDataValue(Object objectValue, Session session) {
//Code to convert org.joda.time.DateTime to java.util.Date in UTC.
//Currently dealing with the following line
//that always uses the system local time zone which is incorrect.
//It should be in the UTC zone.
return objectValue instanceof DateTime ? ((DateTime) objectValue).toDate() : null;
}
@Override
public Object convertDataValueToObjectValue(Object dataValue, Session session) {
return dataValue instanceof Date ? new DateTime((Date) dataValue) : null;
}
@Override
public boolean isMutable() {
return true;
}
@Override
public void initialize(DatabaseMapping databaseMapping, Session session) {
databaseMapping.getField().setType(java.util.Date.class);
}
}
objectValue
параметрconvertObjectValueToDataValue()
метод являетсяinstanceOf
DateTime
который уже в соответствии с зоной UTC. Поэтому я избежал.withZone(DateTimeZone.UTC)
.
На клиенте уже есть отдельный конвертер, который преобразует строковое представление даты-времени вorg.joda.time.DateTime
в UTC перед отправкой в EJBs).
это((DateTime) objectValue).toDate()
в ответном заявленииconvertObjectValueToDataValue()
Метод всегда принимает системный часовой пояс, который должен быть в зоне UTC.
В любом случае дата-время должно быть вставлено в MySQL в соответствии с зоной UTC.
Лучшее / идеальное решение было бы, если бы оно обрабатывало дату-время Joda, подобноезимовать
РЕДАКТИРОВАТЬ:
Свойство типаorg.joda.time.DateTime
В качестве примера обозначен класс модели следующим образом.
@Column(name = "discount_start_date", columnDefinition = "DATETIME")
@Converter(name = "dateTimeConverter", converterClass = JodaDateTimeConverter.class)
@Convert("dateTimeConverter")
private DateTime discountStartDate; //Getter and setter.