Joda LocalDate - все еще мгновенно?

Я ищу правильный сериализуемый класс только для даты. У меня есть сервер в центральном часовом поясе, я хочу, чтобы пользователи на востоке вводили дату как 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();
        }
    }
}

Удачи сериализации с временным полем.

5
задан Konrad Garus 24 November 2010 в 16:08
поделиться