我发现在更改设备的时区时,通过Ormlite读取的日期无法正确返回。
例如,从阿姆斯特丹时间切换到伦敦时间时,日期应该向前移动一小时。但是,从数据库中读取日期时,它会返回相同的时间,但现在在伦敦时区。
我按如下方式存储我的字段:
@DatabaseField(canBeNull = true)
private Date registration;
答案 0 :(得分:15)
查看数据库,我发现默认情况下Ormlite以Date
格式存储YYYY-MM-DD HH:MM:SS.SSS
个对象。由于没有关于时区的信息,因此它假设设备的当前时区。
诀窍是将其存储在UTC时间戳中:
@DatabaseField(canBeNull = true, dataType = DataType.DATE_LONG)
private Date registration;
如果你想亲自动手写下你自己的毅力,这就是它的完成方式:
@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
配置每个日期字段。