Joda LocalDate - 还在片刻吗?

Kon*_*rus 5 java jodatime

我正在寻找一个适当的可序列化日期类.在中央时区有一台服务器,我希望东部的用户输入日期为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中是否有适当的仅限日期的时区敏感类?

编辑:在数据库中我使用时区不敏感列(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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

祝你好运用瞬态字段串行化.

Jod*_*hen 3

trasient上面显示的存根类中的时区是一个错误。令人惊讶的是它没有经过数万次测试或 5 年的广泛使用。错误报告https://sourceforge.net/tracker/index.php?func=detail&aid=3117678&group_id=97367&atid=617889

时区应该是 UTC,如 Javadoc - http://joda-time.sourceforge.net/apidocs/org/joda/time/LocalDate.html中所定义。反序列化以获取任何其他时区将破坏类的内部状态。

JSR-310 使用了更好的内部设计,不会出现此类问题。