Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 731
pt123 Avatar asked Jan 12 '13 06:01

pt123


People also ask

What happens to Google Calendar when you change time zone?

When you travel to a different time zone, you can see your calendar in the local time. Tap General. Tap Use device time zone on or off. If Use device time zone is on, your time zone will update automatically as you travel.

What is coordinated universal time on Google Calendar?

Google Calendar uses Coordinated Universal Time (UTC) to help avoid issues with daylight saving time. When events are created, they're converted into UTC, but you'll always see them in your local time. If an area switches their time zone, events created before we knew about the change might be in the wrong time zone.


1 Answers

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

like image 75
brbaker Avatar answered Sep 21 '22 15:09

brbaker