Calendar .ics文件中的单日全天约会

Calendar .ics文件中的单日全天约会,calendar,icalendar,Calendar,Icalendar,我正在使用ASP.NET创建一个ics文件,用于将假日导入Outlook 2007,并尝试设置全天事件标志。这在多天的假期中效果很好,但在一天中,它似乎没有注册,我只是从午夜到午夜预订了一个“奇点假期” 根据,将开始和结束时间设置为00:00应该足以完成此操作。我还尝试使用X-MICROSOFT-CDO-ALLDAYEVENT和X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT标志,但它们似乎没有任何效果 有人能看出我哪里做错了吗?我在下面包含了样本输出 BEGIN:VCAL

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

根据,将开始和结束时间设置为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

找到了答案。要进行全天活动,您需要将约会安排在第二天午夜结束。

上面的评论是:在苹果的iCal中,第二天午夜对我不起作用。为了解决这个问题,在每个BEGIN:VEVENT部分中,我都输出了如下日期:

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

我不知道你是否还需要微软的标签

不确定MSDN,但根据最新的ical规范,一天的全天活动从第一天开始,到第二天结束(不是午夜,听起来像是一天的结束,但假设为00:00,即一天的开始,我想类似)

在最新的RFC5545规范中,如果没有结束日期或end=start,那么它就有点像周年纪念——而不是一天一天的活动

如果您的ics文件将在其他地方使用或进一步传播,那么值得尝试正确的方法


这里有一个注意事项:

我知道我很晚才参加聚会,但是,全天的活动是由DTSTART指定的,没有DTEND。这在Outlook 2007和Google中对我很有效

@IceCool是对的——仅仅省略
DTEND
是不够的……这将取决于
DTSTART
的数据类型是否有效

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

在RFC 5545()的第3.6.1节中:

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

因此,结果是,要举办全天活动,这还不够:

DTSTART:20100101T000000
它不起作用,因为数据类型是
DATE-TIME
,因此事件的结束与开始相同。要制作全天活动,您需要添加一个显式的
DTEND
(也是
DATE-TIME类型的
):

或者使用
DATE
数据类型,这样就不需要
DTEND

DTSTART;VALUE=DATE:20100101

把这个留给谷歌上的其他人。。我遇到了同样的问题,全天活动和半天活动的混合,尤其是在谷歌日历中

我的问题与如何强制下载ICS文件有关。听起来很傻,但是一个强制下载的标题阻止了GoogleCalendar正确解析全天的事件。流式传输到浏览器的效果更好。这里是示例输出。(使用值=日期)用于单个全天事件

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

对于当前版本的calendar和Outlook365,anmari的答案似乎是最准确的。如果输入的开始和结束相同,它将作为午夜事件进入日历,并作为全天事件进入Outlook365,在开始前一天结束。要同时处理这两种情况,唯一的方法是结束日期比开始日期晚一天。另外,不要包含DTSTAMP,并将DTSTART和DTEND放在日期格式而不是日期时间格式中。

我只是更改了日期的格式,它对我有效

我有这个:

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

DTSTART:" . date('Ymd', strtotime($event->date)) . "
DTSTAMP:" . date('Ymd', strtotime($event->created_at)) . "

我在outlook中尝试过这个,它显示它在第二天午夜结束,而不是全天活动。开始日期是什么?我在前一天的午夜和其他时间尝试过,但在Outlook2007中似乎都不起作用。谢谢这在苹果iCal中也不起作用。您需要使用atomicguava建议的解决方案
DTSTART:20100101
DTSTART和DTEND应为Outlook 2003的8字符格式。然而,一旦您使用2010,这将不再是一个全天的活动。为了使其成为2010年的全天活动,我们需要长格式(例如20101T000000Z)。非常令人沮丧!这在苹果的iCalendar中有效,但在Outlook中不起作用-对于Outlook,您只需要DTSTART,而不需要DTEND。然而,魔弹似乎只使用DTSTART——这在最新的Outlook和iCal中都有效。如果您使用的是
SabreDAV
库,则是这样的:规范与您所说的完全相反(第52页结束):对于“VEVENT”日历组件使用日期-时间数据类型指定“DTSTART”属性,但没有“DTEND”属性,事件在“DTSTART”属性指定的同一日历日期和时间结束。请查看第31页的值类型列表。显然有无需为全天活动指定时间。@ICEOOLMOST complete IMHO。还有最简单的解决方案:只需使用
VALUE=DATE:whateverdate
此答案的最后一行无效。我只是尝试将其导入outlook.com,并从午夜开始获得一个1小时的约会,即使我还有“X-MICROSOFT-CDO-ALLDAYEVENT:TRUE”我必须加上“DURATION:P1D”才能让它成天运行这对我在谷歌和Mac上都有效(我还没有尝试过Outlook)
DTSTART:" . date('Ymd', strtotime($event->date)) . "
DTSTAMP:" . date('Ymd', strtotime($event->created_at)) . "