使用Android日历提供程序创建全天活动

时间:2016-05-26 20:55:16

标签: java android android-contentprovider android-calendar

我希望我的应用将全天活动插入日历中。我从https://developer.android.com/guide/topics/providers/calendar-provider.html给出的例子开始。为了全天制作,我添加ALL_DAY内容值并将时区设置为UTC。我最终得到了以下代码:

long calID = 3;
long startMillis = 0; 
long endMillis = 0;     
Calendar beginTime = Calendar.getInstance();
beginTime.set(2012, 9, 14, 7, 30);
startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2012, 9, 14, 8, 45);
endMillis = endTime.getTimeInMillis();

ContentResolver cr = getContentResolver();
values.put(Events.ALL_DAY, 1)
ContentValues values = new ContentValues();
values.put(Events.DTSTART, startMillis);
values.put(Events.DTEND, endMillis);
values.put(Events.TITLE, "Jazzercise");
values.put(Events.DESCRIPTION, "Group workout");
values.put(Events.CALENDAR_ID, calID);
values.put(Events.EVENT_TIMEZONE, "UTC");
Uri uri = cr.insert(Events.CONTENT_URI, values);

现在,这实际上完成了工作,但DTEND时间似乎是多余的,并且当真正只需要日期时,设置开始和结束时间毫无意义。当我删除DTEND值时,我会收到异常java.lang.IllegalArgumentException: DTEND and DURATION cannot both be null for an event.。什么是正确的价值观?只是如上所述,或者是否/应该使用有意义的信息?

2 个答案:

答案 0 :(得分:2)

DTEND不是多余的,因为它指定了事件的结束。 全天并不意味着它只有一天。它可以跨越任何天数。 全天表示事件的开始和结束没有时间组件。特别是,无论您当时在哪个时区,事件始终从一天开始时开始。一个常见的例子就是你的生日。无论你身在何处,你通常都会在特定的日历日庆祝它。

请注意,Android的日历数据库DTSTARTDTEND应代表UTC中特定日期的午夜。

因此,推导开始日期和结束日期的更好方法是:

TimeZone utc = TimeZone.getTimeZone("UTC");
Calendar beginTime = Calendar.getInstance(utc);
// set all values to 0
beginTime.clear();
beginTime.set(2012, 9, 14);
startMillis = beginTime.getTimeInMillis();

Calendar endTime = Calendar.getInstance(utc);
// the event ends right before the next day begins
endTime.clear();
endTime.set(2012, 9, 15);
endMillis = endTime.getTimeInMillis();

另请注意DTEND不包含(它指向事件后的第一个时刻)。对于为期一天的全天活动,这意味着,DTEND是第二天的开始。

确定事件结束的另一种方法是将事件的持续时间添加到DTSTART,如下所示:

// Add the duration of 1 day to startMillis to get the end
endMillis = startMillis + TimeUnit.DAYS.toMillis(1);

结果与上述相同。

请注意,这是创建非重复活动的方法。如果您创建定期活动,则不得设置DTENDDURATION

答案 1 :(得分:1)

将CalendarContract.Events.DTEND替换为CalendarContract.Events.DURATION

第二种参数格式见RFC5545

 SELECT DATEDIFF(minute, '20:00',DATEADD(minute,-60, '05:00')) 

使用DURATION时不要使用DTEND,否则会引发异常:事件中不能同时使用DTEND和DURATION