This bug should win an award for the most obscure bug I've ever run into this year.
Check out this code below:
Calendar cal1 = new GregorianCalendar(2012, 5, 11); cal1.setTimeZone(TimeZone.getTimeZone("UTC")); Calendar cal2 = new GregorianCalendar(2012, 5, 12); cal2.setTimeZone(TimeZone.getTimeZone("UTC")); DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); df.setTimeZone(TimeZone.getTimeZone("UTC")); Log.i("test","cal1.format=" + df.format(cal1.getTime())); Log.i("test", "cal2.format=" + df.format(cal2.getTime()));
You might expect the two formats to be different (one for May 11, the other for May 12). You would be wrong on Android 2.2 and lower. It turns out in this one specific case, the
SimpleDateFormat will spit out the same formatted date for the two
The conditions seem to be thus:
Calendarobjects that are one day apart.
SimpleDateFormatthat you want to use.
- Both the
DateFormatare set to the same
- You format both
DateFormat, one after another.
In this one situation,
SimpleDateFormat gets into a state where it formats both
Calendars to the same date (May 11). Change any of the above assumptions and the problem will not occur; if the
Calendars are more than one day apart, or you use multiple
SimpleDateFormats, or you don't set the
TimeZone, or you don't immediately reuse the same
This problem does not occur on Android 2.3+. For Android 2.2 and lower, the solution is simple - create a new
SimpleDateFormat when formatting two
Calendars one after another.