(Don't use dday.ical;使用ical.net。它包含许多性能增强和错误修复。)
以X- 为前缀的任何内容都表示它是特定于供应商的。没有标准的方式来表示“不在办公室”与“忙碌”。我相信 Outlook 也有一个“暂定”的概念,它也适用于该领域。
icalendar spec supports 四种基本状态:“FREE”、“BUSY”、“BUSY-UNAVAILABLE”、“BUSY-TENTATIVE”。这些都是VFREEBUSY 组件的有效选项。该规范旨在让 VFREEBUSY 及其子标题 FREEBUSY 组件实质上为尝试计划会议的人们传达忙闲信息。 Outlook 具有日程安排助手功能;它可能会使用 VFREEBUSY 信息来显示其时间线。
所以这并不是你真正想要的。
规范确实有categories 的概念,其中一个例子是“不在办公室”:
“CATEGORIES”属性的一些可能的英文值包括:
“周年纪念”、“约会”、“商业”、“教育”、“假期”、
“会议”、“杂项”、“非工作时间”、“不在办公室”、
“个人”、“电话”、“病假”、“特殊场合”、“旅行”、
“假期”。可以使用任何注册语言指定类别。
这些选项都不是很好,而且,IMO 是规范不足的另一个地方。您几乎想要一个可以在 VFREEBUSY 清单中指定的 BUSY-OUT-OF-OFFICE 状态,但规范没有它,ical.net(或之前的 dday.ical)也没有。
为此,如果 Outlook 是消耗序列化输出的对象,最好手动将 X-MICROSOFT-CDO-BUSYSTATUS 属性添加到事件中:
var now = DateTime.Now;
var later = now.AddHours(1);
var e = new Event
{
DtStart = new CalDateTime(now),
DtEnd = new CalDateTime(later),
};
e.AddProperty("X-MICROSOFT-CDO-BUSYSTATUS", "OOF"); // I think "OOF" is right per the MS documentation
var calendar = new Calendar();
calendar.Events.Add(e);
var serializer = new CalendarSerializer(new SerializationContext());
var icalString = serializer.SerializeToString(calendar);
Console.WriteLine(icalString);
这将生成:
BEGIN:VCALENDAR
PRODID:-//github.com/rianjs/ical.net//NONSGML ical.net 2.1//EN
VERSION:2.0
BEGIN:VEVENT
DTEND:20160827T162931
DTSTAMP:20160827T192931Z
DTSTART:20160827T152931
SEQUENCE:0
UID:fea526df-7f40-4585-a9de-8d422e43eebe
X-MICROSOFT-CDO-BUSYSTATUS:OOF
END:VEVENT
END:VCALENDAR