2009-11-11 58 views
20

我使用ASP.NET创建了一个用于将假日导入Outlook 2007并尝试​​设置全天事件标志的ics文件。这在多日假期中工作得很好,但对于单日来说,它似乎没有注册,我只是得到一个从午夜到午夜预订的'奇异假期'。.ics文件中的单日全天约会

根据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 

回答

4

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

+0

我已经尝试过这种观点,它显示它在第二天午夜结束,而不是整天的事件。开始日期会是什么?我已经尝试过前一天和其他各种时间的午夜,但在Outlook 2007中似乎没有任何工作。谢谢 – Don 2011-03-29 15:55:29

+6

这在Apple iCal中也不起作用。您需要使用atomicguava建议的解决方案。 'DTSTART:20100101' – DesignerGuy 2011-05-03 20:38:20

21

以上评论RE:午后的一天后,苹果的iCal没有为我工作。为了解决这个问题,在每个BEGIN的:VEVENT部分,我已经输出了日期如下:

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

我不知道,如果你仍然需要微软的标签,虽然?

+1

DTSTART和DTEND应该是Outlook 2003的8字符格式。但是,只要您使用2010,这不再是一整天的事件。为了使它成为2010年的全天事件,我们需要长格式(例如20120101T000000Z)。非常令人沮丧! – csharpforevermore 2012-01-19 12:58:39

+0

这适用于Apple的iCalendar,但不适用于Outlook - 对于Outlook,您只需要DTSTART,而不需要DTEND。但是,这个神奇的子弹似乎只使用了* DTSTART,它可以在最新的Outlook和iCal中使用。 – 2018-02-19 10:35:38

+0

如果您使用'SabreDAV'库,则以下方式:https://github.com/sabre-io/vobject/issues/184#issuecomment-70737873 – 2018-02-19 12:10:03

0

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

在最新的规范RFC 5545,如果没有结束日期或结束=开始,那么它是有点周年纪念 - 不是一整天的一整天的事件。

如果您的ics文件要在其他地方使用或进一步传播,那么值得尝试解决这个问题。

了一份关于此位置:http://icalevents.com/1778-all-day-events-adding-a-day-or-not/

+0

链接无法正常工作。出现服务器错误。 – csharpforevermore 2012-01-19 13:09:44

+0

固定链接 - 感谢标记 – anmari 2012-01-29 06:30:20

-2

我知道我非常迟到了,但according to the original RFC,是没有一个DTEND DTSTART指定的全天事件。这适用于Outlook 2007和Google。

+1

该规范与您所说的完全相反(第52页结束): 对于“VEVENT”日历组件指定带有DATE-TIME数据类型但不包含“DATE-TIME”数据类型的“DTSTART” DTEND“属性,事件在”DTSTART“属性指定的相同日历日期和时间结束。 – IceCool 2014-09-01 15:54:39

+1

查看第31页,值类型列表。有(显然)不需要指定一个全天事件的时间。 @IceCool – egbutter 2014-09-02 16:12:23

19

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

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

它在RFC 5545的部分3.6.1(http://tools.ietf.org/html/rfc5545#page-54):

对于箱子,其中“VEVENT”日历组件指定了与一个DATE值类型,但没有“DTEND”也不是“一个“DTSTART”属性DURATION“属性,该活动的持续时间将被视为一天。对于“VEVENT”日历组件指定具有DATE-TIME值类型但没有“DTEND”属性的“DTSTART”属性的情况,该事件在“DTSTART”属性指定的日期和日期相同的日历结束。

所以,结果是,让一整天的活动,这是不够的:

DTSTART:20100101T000000 

它不起作用,因为数据类型为DATE-TIME,所以活动结束是一样的开始。为了使全天事件您可能需要增加一个显DTEND(也DATE-TIME类型):

DTSTART:20100101T000000 
DTEND:20100102T000000 

或使用DATE数据类型,那么就没有必要了DTEND

DTSTART;VALUE=DATE:20100101 
+0

最完整的恕我直言。也有最简单的解决方案:只需使用'VALUE = DATE:whateverdate' – benzkji 2016-02-08 08:01:19

+0

此答案的最后一行不起作用。我试图将其导入到outlook.com中,并且从午夜开始预约1小时,即使我也有“X-MICROSOFT-CDO-ALLDAYEVENT:TRUE”。我不得不添加“DURATION:P1D”以使其成为全天候 – 2016-07-03 19:36:58

2

将此留在这里以供其他人使用谷歌日历。我遇到了同样的问题,混合了全天事件和半天,特别是在Google日历中。

我的问题与如何强制下载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