2016-01-07 18 views
5

SOLVED Ho scoperto che tra mezzanotte e l'1 il mio dispositivo restituisce un'ora 1 ora dopo (le altre 23 ore al giorno restituiscono correttamente). Più stranamente restituisce correttamente se uso kk invece di HH (anche se la stringa risultante è alcuna utilità per me)Android SimpleDateFormat restituisce l'ora non corretta tra mezzanotte e 01:00

Codice sto facendo funzionare: (in questo caso strFormat corrisponde alla stringa hardcoded in df3)

SimpleDateFormat df = new SimpleDateFormat(strFormat, Locale.US); 
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd kk:mm", Locale.US); 
SimpleDateFormat df3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); 

Date d = c.getTime(); 
String s = d.toString(); 
String ret = df.format(c.getTime()); 
String ret2 = df.format(new Date(System.currentTimeMillis())); 
String ret3 = df2.format(c.getTime()); 
String ret4 = df3.format(c.getTime()); 
String r1 = ""+c.get(Calendar.HOUR); 

questi ritorno:

s = "Thu Jan 07 00:39:32 GMT-11:00 2016" 
ret = "2016-01-07 01:39:32" 
ret2 = "2016-01-07 01:39:32" 
ret3 = "2016-01-07 24:39" 
ret4 = "2016-01-07 01:39:32.525" 
r1 = "0" 

Dopo 1:00 questi ritorno:

s = "Thu Jan 07 01:07:09 GMT-11:00 2016" 
ret = "2016-01-07 01:07:09" 
ret2 = "2016-01-07 01:07:09" 
ret3 = "2016-01-07 01:07" 
ret4 = "2016-01-07 01:07:09.606" 
r1 = "1" 

Qualsiasi aiuto in ciò che ho fatto di sbagliato/ciò che sta andando storto è molto apprezzato.

UPDATE

codice cambiando a:

SimpleDateFormat df = new SimpleDateFormat(strFormat, Locale.US); 
     df.setTimeZone(TimeZone.getTimeZone("GMT")); 
     SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd kk:mm zzz", Locale.US); 
     df2.setTimeZone(TimeZone.getTimeZone("GMT")); 
     SimpleDateFormat df3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS zzz", Locale.US); 
     df3.setTimeZone(TimeZone.getTimeZone("GMT")); 
     Date d = c.getTime(); 
     String s = d.toString(); 
     String ret = df.format(c.getTime()); 
     String ret2 = df.format(new Date(System.currentTimeMillis())); 
     String ret3 = df2.format(c.getTime()); 
     String ret4 = df3.format(c.getTime()); 
     String r1 = ""+c.get(Calendar.HOUR); 
     return ret; 

ottengo lo stesso risultato:

s = "Fri Jan 08 00:52:05 GMT 2016" 
ret = "2016-01-08 01:52:05" 
ret2 = "2016-01-08 01:52:05" 
ret3 = "2016-01-08 24:52 GMT" 
ret4 = "2016-01-08 01:52:05.169 GMT" 
r1 = "0" 

e

s = "Fri Jan 08 01:03:23 GMT 2016" 
ret = "2016-01-08 01:03:23" 
ret2 = "2016-01-08 01:03:23" 
ret3 = "2016-01-08 01:03 GMT" 
ret4 = "2016-01-08 01:03:23.547 GMT" 
r1 = "1" 

in modo che il problema sembra essere correlato al fuso orario

+0

Qual è il tuo fuso orario? – SlumpA

+0

Sei sicuro di non aver cambiato nulla nel codice in quei 40 minuti? – SlumpA

+0

Aggiungi "ZZZZ" per vedere il fuso orario in SimpleDateFormat, forse è diverso – headsvk

risposta

0

Il problema era con le compresse stessi - hanno sensori aggiuntivi incorporati in che una volta che si accede incasinato l'orologio interno. Grazie a tutti per il vostro aiuto

1

Idk ... onestamente. Ho provato a riattivare il tuo problema, ma in Eclipse su PC, non in Android. Questo è quello che ho usato:

Calendar c = new GregorianCalendar(TimeZone.getTimeZone(ZoneId.ofOffset("", ZoneOffset.ofHours(-11))), Locale.US); 
    c.set(2016, 0, 7, 0, 7); 

    String strFormat = "yyyy-MM-dd HH:mm:ss.SSS"; 


    SimpleDateFormat df = new SimpleDateFormat(strFormat, Locale.US); 
    SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd kk:mm", Locale.US); 
    SimpleDateFormat df3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); 

    Date d = c.getTime(); 
    String s = d.toString(); 
    String ret = df.format(c.getTime()); 
    String ret2 = df.format(new Date(System.currentTimeMillis())); 
    String ret3 = df2.format(c.getTime()); 
    String ret4 = df3.format(c.getTime()); 
    String r1 = ""+c.get(Calendar.HOUR); 

    System.out.printf("s = %s%nret = %s%nret2 = %s%nret3 = %s%nret4 = %s%nr1 = %s%n%n", s, ret, ret2, ret3, ret4, r1); 

    df.setTimeZone(TimeZone.getTimeZone(ZoneId.ofOffset("", ZoneOffset.ofHours(-11)))); 
    df2.setTimeZone(TimeZone.getTimeZone(ZoneId.ofOffset("", ZoneOffset.ofHours(-11)))); 
    df3.setTimeZone(TimeZone.getTimeZone(ZoneId.ofOffset("", ZoneOffset.ofHours(-11)))); 

    d = c.getTime(); 
    s = d.toString(); 
    ret = df.format(c.getTime()); 
    ret2 = df.format(new Date(System.currentTimeMillis())); 
    ret3 = df2.format(c.getTime()); 
    ret4 = df3.format(c.getTime()); 
    r1 = ""+c.get(Calendar.HOUR); 

    System.out.printf("s = %s%nret = %s%nret2 = %s%nret3 = %s%nret4 = %s%nr1 = %s%n%n", s, ret, ret2, ret3, ret4, r1); 

    c.set(2016, 0, 7, 1, 7); 

    d = c.getTime(); 
    s = d.toString(); 
    ret = df.format(c.getTime()); 
    ret2 = df.format(new Date(System.currentTimeMillis())); 
    ret3 = df2.format(c.getTime()); 
    ret4 = df3.format(c.getTime()); 
    r1 = ""+c.get(Calendar.HOUR); 

    System.out.printf("s = %s%nret = %s%nret2 = %s%nret3 = %s%nret4 = %s%nr1 = %s%n", s, ret, ret2, ret3, ret4, r1); 

E questo è quello che ho ottenuto:

s = Thu Jan 07 12:07:58 CET 2016 
ret = 2016-01-07 12:07:58.662 
ret2 = 2016-01-07 17:55:58.697 
ret3 = 2016-01-07 12:07 
ret4 = 2016-01-07 12:07:58.662 
r1 = 0 

s = Thu Jan 07 12:07:58 CET 2016 
ret = 2016-01-07 00:07:58.662 
ret2 = 2016-01-07 05:55:58.718 
ret3 = 2016-01-07 24:07 
ret4 = 2016-01-07 00:07:58.662 
r1 = 0 

s = Thu Jan 07 13:07:58 CET 2016 
ret = 2016-01-07 01:07:58.662 
ret2 = 2016-01-07 05:55:58.722 
ret3 = 2016-01-07 01:07 
ret4 = 2016-01-07 01:07:58.662 
r1 = 1 

forse c'è un problema nel vostro SimpleDateFormat, che utilizza un fuso orario diverso ... Questo è davvero interessante.

+0

utilizzando 'df.setTimeZone (TimeZone.getTimeZone ("GMT"));' ancora sto ottenendo gli stessi risultati – Collett89

0

possibilmente: c.getTime() restituisce l'ora corrente e SimpleDateFormat lo formatta in Locale.US. Gli Stati Uniti sono un grande paese con diversi fusi orari e il fuso orario del tuo dispositivo potrebbe essere diverso da Locale.US! Rimuovi Locale.US e tienici informati.

+4

io non la penso così. Definire una localizzazione semplicemente formatta la data in modo diverso, non cambia il fuso orario. – SlumpA

4

Potrebbe essere necessario impostare il fuso orario per gli oggetti dataFormat.

ho provato questo:

Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT-11:00"), Locale.US); 
    c.set(2016, 0, 7, 00, 39, 32); 
    Date date = c.getTime(); 

    SimpleDateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US); 
    df.setTimeZone(TimeZone.getTimeZone("GMT-11:00")); 
    SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd kk:mm", Locale.US); 
    df2.setTimeZone(TimeZone.getTimeZone("GMT-11:00")); 
    SimpleDateFormat df3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US); 
    df3.setTimeZone(TimeZone.getTimeZone("GMT-11:00")); 

    String ret = df.format(date.getTime()); 
    String ret2 = df.format(date.getTime()); 
    String ret3 = df2.format(date.getTime()); 
    String ret4 = df3.format(date.getTime()); 

    System.out.println(" ret : "+ret); 
    System.out.println(" ret2 : "+ret2); 
    System.out.println(" ret3 kk: "+ret3); 
    System.out.println(" ret4 : "+ret4); 

Il risultato è corretto:

ret : Thu Jan 07 00:39:32 GMT-11:00 2016 
ret2 : Thu Jan 07 00:39:32 GMT-11:00 2016 
ret3 kk: 2016-01-07 24:39 
ret4 : 2016-01-07 00:39:32.217 
+0

usando 'df.setTimeZone (TimeZone.getTimeZone (" GMT "));' Sto ancora ottenendo lo stesso risultato – Collett89