35

我正在使用 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
4

8 回答 8

54

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

规范说如果DTSTART有一个DATE数据类型,并且没有,DTEND那么事件在它开始的那一天结束时结束。但是如果DTSTART有一个完整的DATE-TIME数据类型,并且没有,DTEND那么它会在它开始的同时完成。

它位于 RFC 5545 的第 3.6.1 节(https://www.rfc-editor.org/rfc/rfc5545#page-54):

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

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

DTSTART:20100101T000000

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

DTSTART:20100101T000000
DTEND:20100102T000000

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

DTSTART;VALUE=DATE:20100101
于 2015-05-14T23:18:50.117 回答
29

The above comment RE: midnight the day after didn't work for me in Apple's iCal. To get around this, in each of the BEGIN:VEVENT sections, I have output the dates as follows:

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

I don't know if you still need the Microsoft tags though?!

于 2010-09-08T17:01:08.543 回答
4

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

于 2009-11-12T08:30:06.260 回答
3

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

我的问题与如何强制下载 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
于 2015-12-12T20:06:03.477 回答
2

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

例如。我有这个:

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)) . "
于 2019-06-02T09:16:35.260 回答
2

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

于 2019-02-13T15:11:58.450 回答
0

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

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

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

此处对此进行说明:http: //icalevents.com/1778-all-day-events-adding-a-day-or-not/

于 2010-09-22T06:58:52.363 回答
-2

我知道我参加聚会很晚,但根据原始 RFC,全天事件由没有 DTEND 的 DTSTART 指定。这适用于 Outlook 2007 和 Google。

于 2014-05-07T13:04:59.653 回答