我使用官方网站上的教程编写了一个简单的代码,将全天事件插入日历。 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 的悉尼。
所以我去设置将当地时区更改为美国东部(格林威治标准时间 -5)并运行相同的代码并且日期没有变化。然后我将时区更改为 GMT+2,伊斯坦布尔,日期发生了变化。然后我改到伦敦格林威治标准时间 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(悉尼时间)。所以问题一定出在谷歌日历读取这些值的方式上。当我从 Android 中的日历应用程序手动添加全天事件并使用内容解析器读取时间时,它是 AEST(悉尼时间)的日期和上午 11 点,对应于悉尼的 +11 GMT 关闭时间。因此,需要在 GMT 中输入全天事件以避免这种情况,但文档中没有提及这一点。
所以现在我正在转移时间,以避免这个问题。