在.ics文件中单日全天约会

时间:2009-11-11 16:13:42

标签: calendar icalendar

我正在使用ASP.NET创建一个ics文件,用于将假日导入Outlook 2007并尝试​​设置全天事件标志。这在多日假期工作正常,但是单日,它似乎没有注册,我只是从午夜到午夜预订了一个“奇点假期”。

根据MSDN,将开始和结束时间设置为00:00应该足以执行此操作。我也尝试过使用X-MICROSOFT-CDO-ALLDAYEVENT和X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT标志,但它们似乎没有任何效果。

谁能看到我哪里出错了?我在下面列出了样本输出。

BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN
VERSION:2.0
METHOD:PUBLISH
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VEVENT
CLASS:PUBLIC
DESCRIPTION:HOLIDAY\n
DTEND;VALUE=DATE:20090727
DTSTAMP:20091111T000000Z
DTSTART;VALUE=DATE:20090727
LAST-MODIFIED:20091111T000000Z
PRIORITY:5
SEQUENCE:0
SUMMARY;LANGUAGE=en-gb:HOLIDAY
TRANSP:OPAQUE
X-ALT-DESC;FMTTYPE=text/html:HOLIDAY
X-MICROSOFT-CDO-BUSYSTATUS:OOF
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-CONFTYPE:0
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
END:VEVENT
END:VCALENDAR

8 个答案:

答案 0 :(得分:30)

@IceCool是对的 - 简单地省略DTEND是不够的......它将取决于DTSTART的数据类型是否有效。

规范指出,如果DTSTART的数据类型为DATE,且没有DTEND,那么该事件会在它开始的那天结束时结束。但是,如果DTSTART具有完整的DATE-TIME数据类型,并且没有DTEND,则它会在启动的同时完成。

在RFC 5545(http://tools.ietf.org/html/rfc5545#page-54)的第3.6.1节中:

  

对于“VEVENT”日历组件指定具有DATE值类型但没有“DTEND”或“DURATION”属性的“DTSTART”属性的情况,事件的持续时间将被视为一天。对于“VEVENT”日历组件指定具有DATE-TIME值类型但没有“DTEND”属性的“DTSTART”属性的情况,该事件在“DTSTART”属性指定的相同日历日期和时间结束。 / p>

所以,结果是,为了获得一整天的活动,这还不够:

DTSTART:20100101T000000

它不起作用,因为数据类型为DATE-TIME,因此事件的结尾与开始相同。要制作一整天的活动,您需要添加一个明确的DTEND(同样类型为DATE-TIME):

DTSTART:20100101T000000
DTEND:20100102T000000

或使用DATE数据类型,然后就不需要DTEND

DTSTART;VALUE=DATE:20100101

答案 1 :(得分:23)

以上评论RE:在Apple的iCal中没有为我工作的第二天午夜。为了解决这个问题,在每个BEGIN:VEVENT部分中,我输出日期如下:

DTSTART;VALUE=DATE:20100101
DTEND;VALUE=DATE:20100101

我不知道您是否还需要Microsoft标签?!

答案 2 :(得分:3)

找到了答案。要做一整天的活动,你需要在第二天的午夜结束约会。

答案 3 :(得分:2)

将此留给其他人使用谷歌搜索...我遇到了同样的问题,包括全天活动和半天,特别是在谷歌日历中。

我的问题与强制下载ICS文件的方式有关。听起来很傻,但是强制下载的标题阻止了Google日历正确解析整天的事件。流式传输到浏览器有更好的结果。此处输出示例。 (使用VALUE = DATE)进行单日全天活动。

BEGIN:VEVENT
UID:1248
DTSTART;VALUE=DATE:20151218
DTEND;VALUE=DATE:20151219
DTSTAMP:20151218T080000Z
CREATED:20151212T200409Z
DESCRIPTION:examplea
LAST-MODIFIED:20151218T080000Z
LOCATION:
SUMMARY:example summary
SEQUENCE:0
STATUS:CONFIRMED
TRANSP:OPAQUE
END:VEVENT
BEGIN:VEVENT
UID:1249
DTSTART;VALUE=DATE:20151217
DTEND;VALUE=DATE:20151218
DTSTAMP:20151217T080000Z
CREATED:20151212T200409Z
DESCRIPTION:example1
LAST-MODIFIED:20151217T080000Z
LOCATION:
SUMMARY:Example
SEQUENCE:0
STATUS:CONFIRMED
TRANSP:OPAQUE
END:VEVENT

答案 4 :(得分:0)

不确定MSDN,但根据最新的规格,一天的全天活动在1天开始,在下一天结束(不是午夜,听起来像是一天的结束,但假设是00:00,即开始的一天,类似的我想)

在最新的规范RFC 5545中,如果没有结束日期或结束=开始,那么它就是一个周年纪念 - 而不是一整天的活动。

如果您的ics文件要在别处使用或进一步传播,那么值得尝试做到这一点。

关于此的说明:http://icalevents.com/1778-all-day-events-adding-a-day-or-not/

答案 5 :(得分:0)

对于当前版本的日历和Outlook365,

anmari的答案似乎是最准确的。如果输入相同的开始和结束,它将作为午夜事件进入日历,并且作为结束于开始前一天的全天事件进入Outlook365。两者都可以使用的唯一方法是,结束日期要比开始日期晚一天。另外,请勿包括DTSTAMP并将DTSTART和DTEND设置为日期格式,而不是日期时间格式。

答案 6 :(得分:0)

我只是更改了日期的格式化方式,并且它对我有用。

例如。我有这个:

int

更改为:

DTSTART: " . date(ICAL_FORMAT, strtotime($event->date)) . "
DTEND:" . date(ICAL_FORMAT, strtotime($event->date)) . "

答案 7 :(得分:-2)

我知道我参加聚会很晚,但是according to the original RFC,全天活动是由没有DTEND的DTSTART指定的。这适用于Outlook 2007和Google。