从Ormlite读取日期时的时区问题

时间:2012-11-13 09:27:00

标签: android ormlite

我发现在更改设备的时区时,通过Ormlite读取的日期无法正确返回。

例如,从阿姆斯特丹时间切换到伦敦时间时,日期应该向前移动一小时。但是,从数据库中读取日期时,它会返回相同的时间,但现在在伦敦时区。

我按如下方式存储我的字段:

@DatabaseField(canBeNull = true)
private Date registration;

2 个答案:

答案 0 :(得分:15)

查看数据库,我发现默认情况下Ormlite以Date格式存储YYYY-MM-DD HH:MM:SS.SSS个对象。由于没有关于时区的信息,因此它假设设备的当前时区。

简单方法:时间戳

诀窍是将其存储在UTC时间戳中:

@DatabaseField(canBeNull = true, dataType = DataType.DATE_LONG)
private Date registration;

高级方式:persister

如果你想亲自动手写下你自己的毅力,这就是它的完成方式:

@DatabaseField(persisterClass = DateConverter.class)
private Date registration;

其中:

public static class DateConverter extends LongType {

    private static final DateConverter singleton = new DateConverter();

    protected DateConverter() {
        super(SqlType.LONG, new Class<?>[] {
                Date.class
        });
    }

    public static DateConverter getSingleton() {
        return singleton;
    }

    @Override
    public Object javaToSqlArg(FieldType fieldType, Object javaObject) 
            throws SQLException {
        if (javaObject instanceof Date) {
            return ((Date) javaObject).getTime();
        }
        return javaObject;
    }

    @Override
    public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos)
            throws SQLException {
        if (sqlArg instanceof Long) {
            return new Date((Long) sqlArg);
        }
        return null;
    }

}

答案 1 :(得分:1)

如果您正在寻找一种全局方式来配置OrmLite如何保留日期字段,您可以使用DataPersisterManager类(Github)。

例如,要将所有日期保存为UTC(自纪元以来的毫秒数)而不是默认值(即没有时区的字符串),您可以执行以下操作:

    DataPersisterManager.registerDataPersisters(DateLongType.getSingleton());

然后,无需使用dataType = DataType.DATE_LONG配置每个日期字段。