公式サイトのチュートリアルを使用して、終日のイベントをカレンダーに挿入する簡単なコードを作成しました。 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);
4.03 を実行している Acer デバイスで Google カレンダー アプリを開くと、入力した日付が 1 日ずれていることがわかりました。私のローカル タイムゾーンは GMT+10 であるシドニーです。
そこで、設定に移動して、ローカル タイム ゾーンをアメリカ東部 (GMT -5) に変更し、同じコードを実行しましたが、日付にずれはありませんでした。その後、タイムゾーンをイスタンブールの GMT+2 に変更したところ、日付がずれていました。その後、ロンドンGMT 0に変更しましたが、シフトはありませんでした。
終日イベントを行っていない場合、タイムゾーンに関係なく、正しい時間がカレンダーに入力されました。
私が見つけた最も近いバグレポートはこれでした http://code.google.com/p/android/issues/detail?id=14051
コードに何かが欠けているのでしょうか、それとも他の人もこれに遭遇しましたか?
編集 コンテンツ リゾルバーを使用してイベント データを読み取る際のさらなる検査について
ContentResolver cr = context.getContentResolver();
Uri uri = CalendarContract.Events.CONTENT_URI;
String selection =CalendarContract.Events._ID + "=?";
String [] selectionArgs = new String[]{String.valueOf(eventID)};
日付に変換するときの long の値は、正しい日付と時刻でした。2013 年 2 月 14 日 12.00 AEST (シドニー時間)。したがって、問題は Google カレンダーがこれらの値を読み取る方法にあるに違いありません。Android のカレンダー アプリケーションから終日のイベントを手動で追加し、コンテンツ リゾルバーを使用して時刻を読み取ったところ、AEST (シドニー時間) の日付と午前 11 時でした。これは、シドニーの GMT オフセット +11 に相当します。したがって、これを回避するには、終日のイベントを GMT で入力する必要がありますが、ドキュメントにはこれについての言及はありません。
そのため、この問題を回避するために、時間をずらしています。