Я написал простой код, чтобы вставить событие в течение всего дня в календарь, используя учебник с официального сайта. 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);
Я обнаружил, что когда я открыл приложение Календаря Google на моем устройстве Acer с 4.03, введенная дата была перенесена на 1 день. Мой локальный часовой пояс - Сидней, GMT + 10.
Итак, я пошел в настройки, изменив локальный часовой пояс на американский восток (GMT -5) и запустив тот же код, и не было сдвига в датах. Затем я изменил часовой пояс на GMT + 2, Стамбул, и произошел сдвиг в датах. Затем я перебрался в Лондон в формате GMT 0, и сдвиг не изменился.
Когда я делал не весь день, правильные времена были введены в календарь независимо от часового пояса.
Самый близкий отчет об ошибке, который я нашел, это http://code.google.com/p/android/issues/detail?id=14051
Я пропустил что-то в коде, или другие люди тоже столкнулись с этим.
Edit При дальнейшей проверке при чтении данных о событиях с использованием преобразователя содержимого
ContentResolver cr = context.getContentResolver();
Uri uri = CalendarContract.Events.CONTENT_URI;
String selection =CalendarContract.Events._ID + "=?";
String [] selectionArgs = new String[]{String.valueOf(eventID)};
Значение long при конвертировании на дату было правильной датой и временем, например. 14 февраля 2013 г. 12.00 AEST (Сиднейское время). Поэтому проблема должна быть в том, как Google Calendar читает эти значения. Когда я добавил событие всего дня вручную из приложения "Календарь" на Android и прочитал время, используя контент-резольвер, это была дата и 11.00 утра в AEST (Sydney Time), что соответствует +11 GMT, установленному в Сиднее. Поэтому все дневные события необходимо вводить в GMT, чтобы этого избежать, но об этом не упоминается в документации.
Итак, теперь я меняю время, чтобы избежать этой проблемы.