Android Calendar All Day event dates are off by one day for GMT +x Areas

pt123 picture pt123 · Jan 12, 2013 · Viewed 7.4k times · Source

I wrote a simple code to insert an all day event into the calendar, using the tutorial from the official site. http://developer.android.com/guide/topics/providers/calendar-provider.html

    ContentResolver cr = context.getContentResolver();
    ContentValues values = new ContentValues();
    values.put(Events.DTSTART, dueDate.getTime());
    values.put(Events.ALL_DAY, true);   
    values.put(Events.DTEND, dueDate.getTime());
    values.put(Events.TITLE, "Some Event");
    values.put(Events.CALENDAR_ID, mCalID);
    TimeZone tz = TimeZone.getDefault();
    values.put(Events.EVENT_TIMEZONE, tz.getID());
   Uri uri = cr.insert(Events.CONTENT_URI, values);

I found that when I opened the Google Calendar app on the my Acer device running 4.03, the date entered had been shifted back by 1 day. My local timezone is Sydney which is GMT+10.

So I went to settings changed the local time zone to American Eastern (GMT -5) and ran the same code and there was no shift in the dates. Then I changed the timezone to GMT+2, Istanbul and there was a shift in the dates. Then I changed to London GMT 0, and there was no shift.

When I did non all day events the correct times were entered into the calendar regardless of the timezone.

The closest bug report I found was this http://code.google.com/p/android/issues/detail?id=14051

Am I missing something in the code, or have others also encountered this.

Edit On further inspection when reading Event data using content resolver

  ContentResolver cr = context.getContentResolver();
Uri uri =  CalendarContract.Events.CONTENT_URI; 
String selection =CalendarContract.Events._ID + "=?";
String [] selectionArgs = new String[]{String.valueOf(eventID)}; 

The value of the long when convert to date was the correct date and time eg. 14th Feb 2013 12.00 AEST (Sydney Time). So the problem must be in the way Google Calendar is reading in these values. When I added an all day event manually from the Calendar application in Android, and the read the time using content resolver it was the date and 11.00 am in AEST (Sydney Time), which corresponds to the +11 GMT off set in Sydney. So all day events need to be entered in GMT to avoid this, but there is no mention of this in the documentation.

So now I am shifting the time, to avoid this problem.

Answer

brbaker picture brbaker · Sep 15, 2013

A couple ideas:

  1. time zone "independence" of all-day events (treated as if having GMT) [1] [2]
  2. international date line

[1]"If allDay is set to 1 eventTimezone must be TIMEZONE_UTC and the time must correspond to a midnight boundary."

[2]http://developer.android.com/reference/android/provider/CalendarContract.Events.html