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.

Estoy almacenando mi campo de la siguiente manera:

@DatabaseField(canBeNull = true) private Date registration; 

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 .

  • Android - Uso de DAO de ORMLite como ContentProvider
  • Android - Código de error 11 al importar la base de datos Sqlite en Galaxy Note
  • Consulta de ORMLite para la fecha
  • ORMLite Seleccionar campos distintos
  • Prueba de la clase de comunicación con DB a través de DAO de ORMLite
  • Usando limit () y offset () en QueryBuilder (ANDROID, ORMLITE)
  • Android ORMLite. LEFT unirse. Dónde cláusula
  • Cómo realizar la eliminación en cascada de una clave externa usando ormlite en android
  • ¿OrmLite debería suceder las operaciones de db en el hilo principal?
  • ¿Ormlite admite la herencia?
  • ORMLite JOINs o mapeo automático de rawQuery
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.