Problemas de zona horaria al leer la fecha de Ormlite
Descubrí que las fechas que se leen a través de Ormlite no se devuelven correctamente al cambiar la zona horaria de mi dispositivo.
Por ejemplo, al cambiar de hora de Amsterdam a hora de Londres, la fecha debe cambiar adelante una hora. Sin embargo, al leer la fecha de la base de datos, devuelve el mismo tiempo, pero ahora en la zona horaria de Londres.
- ¿Soporte de ormlite por lotes crear y actualizar, eliminar
- Cómo ordenar por random () en ORMLite
- Android / ORMLite Insertar fila con ID
- Cómo extender la clase BaseDaoImpl de ORMLite en Android para ampliar la funcionalidad
- Archivo de configuración de Android Studio ORMLite - No se pudo encontrar el directorio de Raw
Estoy almacenando mi campo de la siguiente manera:
@DatabaseField(canBeNull = true) private Date registration;
- El bloqueo de la aplicación con "android.app.Application no se puede convertir en"
- Integración ormlite-4.9 con sqlcipher-2.08
- ORMLite - CallBatchTasks () individualmente o una vez para todas las actualizaciones?
- Eliminación automática de objetos anidados en ORMLite
- Guardando colección extranjera en ORMLite con Robospice y Scala
- Objeto de almacenamiento Robospice que extiende ArrayList en la base de datos a través de Ormlite
- Relación uno-a-muchos en ORMLite Android
- OrmLite SQLiteException: ninguna tabla
Buscando en la base de datos, descubrí que Ormlite por defecto almacena objetos de Date
en el formato YYYY-MM-DD HH:MM:SS.SSS
. Como no hay información sobre la zona horaria, se supone que la zona horaria actual del dispositivo.
Manera fácil: timestamp
El truco es almacenarlo en una marca de tiempo UTC en su lugar:
@DatabaseField(canBeNull = true, dataType = DataType.DATE_LONG) private Date registration;
Forma avanzada: persister
Si quieres ponerte las manos sucias escribiendo tu propio persister, así es como se hace:
@DatabaseField(persisterClass = DateConverter.class) private Date registration;
Dónde:
public static class DateConverterextends LongType { private static final DateConvertersingleton = 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; } }
Si está buscando una forma global de configurar cómo OrmLite persiste los campos de fecha, puede utilizar la clase DataPersisterManager
( Github ).
Por ejemplo, para guardar todas las fechas como Longs en UTC (milisegundos desde la época) en lugar del valor predeterminado, que es Strings sin zonas horarias, puede hacer esto:
DataPersisterManager.registerDataPersisters(DateLongType.getSingleton());
Entonces no hay necesidad de configurar cada campo de fecha con dataType = DataType.DATE_LONG
.