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

Pau*_*sma 11 android ormlite

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

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

我存储我的字段如下:

@DatabaseField(canBeNull = true)
private Date registration;
Run Code Online (Sandbox Code Playgroud)

Pau*_*sma 15

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

简单方法:时间戳

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

@DatabaseField(canBeNull = true, dataType = DataType.DATE_LONG)
private Date registration;
Run Code Online (Sandbox Code Playgroud)

先进的方式:坚持

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

@DatabaseField(persisterClass = DateConverter.class)
private Date registration;
Run Code Online (Sandbox Code Playgroud)

哪里:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)