Я ищу правильный сериализуемый класс только для даты. У меня есть сервер в центральном часовом поясе, я хочу, чтобы пользователи на востоке вводили дату как 2010-11-23, а пользователи в Тихом океане - как 2010-11-23 (и наоборот) .
java.util.Date
- это момент времени, поэтому он не работает для меня. Не желая изобретать велосипед, я решил попробовать Joda Time. Согласно обзору, LocalDate
- это «класс, представляющий локальную дату без времени (без часового пояса)» - именно то, что мне нужно.
К сожалению, он не кажется независимым от часового пояса. В базе есть 2010-11-23. На сервере я преобразовываю его в LocalDate
с помощью new LocalDate (java.sql.Date)
. date.toString ()
печатает 2010-11-23.
После десериализации этого на клиенте date.ToString ()
печатает 2010-11-22 и date. getDayOfMonth ()
равно 22. Но date.toDateTimeAtStartOfDay ()
производит 2010-11-23T00: 00: 00.000-08: 00.
Я что-то делаю не так? Есть ли в Joda подходящий класс, нечувствительный к часовому поясу только для даты?
EDIT : В базе данных я использую столбец, нечувствительный к часовому поясу ( DATE
в Postgres). Сервер находится в том же часовом поясе, что и база данных, поэтому он отлично читает дату. Это не проблема. Я ищу тип Java, который когда-то был создан в одном часовом поясе, имеет одно и то же гражданское (частичное) значение даты во всех часовых поясах.
РЕДАКТИРОВАТЬ 2 : на сервере все загружено правильно и имеет UTC часовой пояс. После расследования я думаю, что это ошибка в ISOChronology
. На клиенте он распаковывается как America / Los_Angeles. Причина в том, что сериализация выполняется с помощью:
class ISOChronology {
// ...
private Object writeReplace() {
return new Stub(getZone());
}
private static final class Stub implements Serializable {
private static final long serialVersionUID = -6212696554273812441L;
private transient DateTimeZone iZone;
Stub(DateTimeZone zone) {
iZone = zone;
}
private Object readResolve() {
return ISOChronology.getInstance(iZone);
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.writeObject(iZone);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
iZone = (DateTimeZone)in.readObject();
}
}
}
Удачи сериализации с временным полем.