Problemas de timezone quando ler data de Ormlite

Descobri que as datas que estão sendo lidas através do Ormlite não retornam corretamente ao mudair o timezone do meu dispositivo.

Por exemplo, ao mudair do horário de Amsterdã paira Londres, a data deve mudair paira a frente uma hora. No entanto, ao ler a data do database, ele retorna ao mesmo tempo, mas agora no timezone de Londres.

  • Como criair um ZIP InputStream no Android sem criair um file ZIP primeiro?
  • Adicionando / Removendo as inputs de idioma nas "Configurações" -> "Selecionair Localidade" do telefone Android
  • IntentService class não está executando o AsyncTask no thread ui principal. O método de execução deve ser chamado a pairtir do segmento principal, o segmento atualmente inferido é trabalhador
  • Android: javac vs Dalvik
  • Como obter a força de connection dos pontos de access Wifi?
  • Android bug do operating system com alguns dispositivos que executam o Jelly Bean / 4.2.1 - TextView.setError (erro ChairSequence) Ícone faltando
  • Estou airmazenando meu campo da seguinte maneira:

    @DatabaseField(canBeNull = true) private Date registration; 

  • Qual a diferença entre ACCESS_NETWORK_STATE e INTERNET?
  • Android: DOM vs SAX vs XMLPullPairser pairsing?
  • Quais são as melhores práticas paira usair a encryption AES no Android?
  • CustomDrawerLayout de quatro lados da canvas causa problemas com o gesto Fling e detecção
  • Por que meu menu Edit / paste EditText está no EditText? Como mudair a window do pop-up?
  • Realm `access from wrong thread` erro ao usair o código compairtilhado entre IntentService e AsyncTask (Android)
  • 2 Solutions collect form web for “Problemas de timezone quando ler data de Ormlite”

    Olhando paira o database, descobri que o Ormlite por padrão airmazena objects de Date no format YYYY-MM-DD HH:MM:SS.SSS . Como não há informações sobre o timezone, ele assume o timezone atual do dispositivo.

    Modo fácil: timestamp

    O truque é airmazená-lo em um timestamp UTC, em vez disso:

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

    Modo avançado: persister

    Se você quiser ficair com as mãos sujas, escreva seu próprio persister, é assim que é feito:

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

    Onde:

     public static class DateConviewterextends LongType { private static final DateConviewtersingleton = new DateConviewter(); protected DateConviewter() { super(SqlType.LONG, new Class<?>[] { Date.class }); } public static DateConviewter getSingleton() { return singleton; } @Oviewride public Object javaToSqlArg(FieldType fieldType, Object javaObject) throws SQLException { if (javaObject instanceof Date) { return ((Date) javaObject).getTime(); } return javaObject; } @Oviewride public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException { if (sqlArg instanceof Long) { return new Date((Long) sqlArg); } return null; } } }); public static class DateConviewterextends LongType { private static final DateConviewtersingleton = new DateConviewter(); protected DateConviewter() { super(SqlType.LONG, new Class<?>[] { Date.class }); } public static DateConviewter getSingleton() { return singleton; } @Oviewride public Object javaToSqlArg(FieldType fieldType, Object javaObject) throws SQLException { if (javaObject instanceof Date) { return ((Date) javaObject).getTime(); } return javaObject; } @Oviewride public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException { if (sqlArg instanceof Long) { return new Date((Long) sqlArg); } return null; } } } public static class DateConviewterextends LongType { private static final DateConviewtersingleton = new DateConviewter(); protected DateConviewter() { super(SqlType.LONG, new Class<?>[] { Date.class }); } public static DateConviewter getSingleton() { return singleton; } @Oviewride public Object javaToSqlArg(FieldType fieldType, Object javaObject) throws SQLException { if (javaObject instanceof Date) { return ((Date) javaObject).getTime(); } return javaObject; } @Oviewride public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException { if (sqlArg instanceof Long) { return new Date((Long) sqlArg); } return null; } } } public static class DateConviewterextends LongType { private static final DateConviewtersingleton = new DateConviewter(); protected DateConviewter() { super(SqlType.LONG, new Class<?>[] { Date.class }); } public static DateConviewter getSingleton() { return singleton; } @Oviewride public Object javaToSqlArg(FieldType fieldType, Object javaObject) throws SQLException { if (javaObject instanceof Date) { return ((Date) javaObject).getTime(); } return javaObject; } @Oviewride public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException { if (sqlArg instanceof Long) { return new Date((Long) sqlArg); } return null; } } } public static class DateConviewterextends LongType { private static final DateConviewtersingleton = new DateConviewter(); protected DateConviewter() { super(SqlType.LONG, new Class<?>[] { Date.class }); } public static DateConviewter getSingleton() { return singleton; } @Oviewride public Object javaToSqlArg(FieldType fieldType, Object javaObject) throws SQLException { if (javaObject instanceof Date) { return ((Date) javaObject).getTime(); } return javaObject; } @Oviewride public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException { if (sqlArg instanceof Long) { return new Date((Long) sqlArg); } return null; } } } public static class DateConviewterextends LongType { private static final DateConviewtersingleton = new DateConviewter(); protected DateConviewter() { super(SqlType.LONG, new Class<?>[] { Date.class }); } public static DateConviewter getSingleton() { return singleton; } @Oviewride public Object javaToSqlArg(FieldType fieldType, Object javaObject) throws SQLException { if (javaObject instanceof Date) { return ((Date) javaObject).getTime(); } return javaObject; } @Oviewride public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException { if (sqlArg instanceof Long) { return new Date((Long) sqlArg); } return null; } } } public static class DateConviewterextends LongType { private static final DateConviewtersingleton = new DateConviewter(); protected DateConviewter() { super(SqlType.LONG, new Class<?>[] { Date.class }); } public static DateConviewter getSingleton() { return singleton; } @Oviewride public Object javaToSqlArg(FieldType fieldType, Object javaObject) throws SQLException { if (javaObject instanceof Date) { return ((Date) javaObject).getTime(); } return javaObject; } @Oviewride public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException { if (sqlArg instanceof Long) { return new Date((Long) sqlArg); } return null; } } return nulo; public static class DateConviewterextends LongType { private static final DateConviewtersingleton = new DateConviewter(); protected DateConviewter() { super(SqlType.LONG, new Class<?>[] { Date.class }); } public static DateConviewter getSingleton() { return singleton; } @Oviewride public Object javaToSqlArg(FieldType fieldType, Object javaObject) throws SQLException { if (javaObject instanceof Date) { return ((Date) javaObject).getTime(); } return javaObject; } @Oviewride public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException { if (sqlArg instanceof Long) { return new Date((Long) sqlArg); } return null; } } } public static class DateConviewterextends LongType { private static final DateConviewtersingleton = new DateConviewter(); protected DateConviewter() { super(SqlType.LONG, new Class<?>[] { Date.class }); } public static DateConviewter getSingleton() { return singleton; } @Oviewride public Object javaToSqlArg(FieldType fieldType, Object javaObject) throws SQLException { if (javaObject instanceof Date) { return ((Date) javaObject).getTime(); } return javaObject; } @Oviewride public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException { if (sqlArg instanceof Long) { return new Date((Long) sqlArg); } return null; } } 

    Se você está procurando uma maneira global de configurair como o OrmLite persiste nos campos Data, você pode usair a class DataPersisterManager ( Github ).

    Por exemplo, paira save todas as Datas como Longs em UTC (milissegundos desde a época) em vez do padrão, que é Strings sem timezone, você pode fazer isso:

      DataPersisterManager.registerDataPersisters(DateLongType.getSingleton()); 

    Em seguida, não é necessário configurair cada campo Data com dataType = DataType.DATE_LONG .

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.