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

问题描述 投票:26回答:8

我正在使用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
calendar icalendar
8个回答
35
投票

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

规范说如果DTSTARTDATE数据类型,并且没有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”属性指定的相同日历日期和时间结束。

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

DTSTART:20100101T000000

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

DTSTART:20100101T000000
DTEND:20100102T000000

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

DTSTART;VALUE=DATE:20100101

23
投票

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

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

我不知道你是否仍然需要微软的标签?!


4
投票

找到了答案。要进行一整天的活动,您需要在第二天的午夜结束预约。


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

0
投票

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

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

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

这里有一个注释:http://icalevents.com/1778-all-day-events-adding-a-day-or-not/


0
投票

对于日历和Outlook365的当前版本,anmari的答案似乎是最准确的。如果一个开始和结束相同,它将作为午夜事件进入日历,它将作为一整天事件进入Outlook365,该事件在它开始前一天结束。与它们一起工作的唯一方法是结束日期比开始日期晚一天。另外,不要包含DTSTAMP,并将DTSTART和DTEND置于日期格式而不是日期时间格式。


0
投票

我只是改变了日期格式的方式,它对我有用。

例如。我有这个:

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)) . "

-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.