Android SimpleDateFormat returns wrong time between midnight and 1 hour

SOLVING I found that from midnight to 1 hour, my device returns time after 1 hour (the remaining 23 hours a day it returns correctly). More strangely, this returns correctly if I use kk instead of HH (although the resulting string does not suit me)

The code I run is: (in this case strFormat matches the hard-coded string 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); 

Return:

 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" 

After 1 hour they return:

 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" 

Any help on what I did wrong / what is going wrong is greatly appreciated.

UPDATE

change code to:

 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; 

I get the same results:

 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" 

and

 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" 

therefore the problem does not seem to be related to TimeZone

+5
source share
4 answers

The problem is with the tablets themselves - they have additional sensors built into the fact that once access to them confused the internal clock. Thank you all for your help.

0
source

Perhaps you need to set timeZone for your dateFormat objects.

I tried this:

  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); 

The result is correct:

  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 
+4
source

Idk ... honestly. I tried to recreate your problem, but in Eclipse on a PC, not on Android. This is what I used:

  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); 

And here is what I got:

 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 

Perhaps there is a problem in your SimpleDateFormat that uses a different time zone ... This is really interesting.

+1
source

maybe: c.getTime () returns your current time, and SimpleDateFormat formats it in Locale.US. The USA is a large country with different time zones, and the time zone of your device may differ from Locale.US! Remove Locale.US and keep us updated.

0
source

Source: https://habr.com/ru/post/1240102/


All Articles