从日历获取全天活动

时间:2016-03-17 16:48:57

标签: android calendar

我看到日历中全天活动的奇怪行为。根据文档,他们的开始时间应该是UTC毫秒。然而,似乎它们随着时区而移动。

    projection = new String[]{CalendarContract.Instances.ORGANIZER, CalendarContract.Instances.TITLE,
            CalendarContract.Instances.DESCRIPTION, CalendarContract.Instances.BEGIN, CalendarContract
            .Instances.END, CalendarContract.Instances.EVENT_LOCATION, CalendarContract.Instances
            .EVENT_TIMEZONE, CalendarContract.Instances.EVENT_END_TIMEZONE, CalendarContract.Instances
            .EVENT_ID, CalendarContract.Instances.ALL_DAY};
dtstart = Long.valueOf(cursor.getLong(cursor.getColumnIndex(CalendarContract.Instances.BEGIN)));
Date d = new Date(dtstart);

如果我使用Android 6上的默认Google日历应用程序在2016年3月17日创建新的全天活动,我会在03/17/2016 01:00获取,因为我使用的是GMT + 1。但是我希望03/17/2016 00:00

1 个答案:

答案 0 :(得分:1)

经过多次尝试后,我发现全天事件没有以UTC时间存储,或者至少以不同的方式检索它们。例如:

03/27/2016 0:00 AM的全天活动实际上被视为03/27/2016 01:00 AM,GMT + 1

所以你想要做的是使用毫秒(UTC)执行查询然后 如果活动是全天活动,请以这种方式检查时间:

TimeZone tz = TimeZone.getDefault();
long evStart =  cursor.getLong(cursor.getColumnIndex(CalendarContract.Instances.BEGIN));
evStart -= tz.getOffset(evStart);
if (evStart < start)
//skip

通过这种方式,如果事件在查询开始使用后实际启动,则可以跳过该事件。我怀疑对于错误,Instance查询确实返回UTC中的所有正常事件,并且可能在查询的某个外层,它错误地将全天事件时间调整为UTC,即使它们已经是UTC。