为什么 iCal.Net 生成无效时间?

Why is iCal.Net generating an invalid time?

我正在使用 iCal.Net 生成 .ics 文档。

Event calendarEvent = new Event
{
    IsAllDay = false,
    Summary = "summary",
    Description = "summary",
    DtStart = new CalDateTime(TimeZoneInfo.ConvertTimeFromUtc(start,TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")), "America/New_York"),
    DtEnd = new CalDateTime(TimeZoneInfo.ConvertTimeFromUtc(end, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")), "America/New_York")
};

var calendar = new Calendar();
calendar.AddTimeZone(new VTimeZone("America/New_York"));
calendar.Events.Add(calendarEvent);

var serializer = new CalendarSerializer(new SerializationContext());
return serializer.SerializeToString(calendar);

通常,生成的开始日期和结束日期类似于:

DTEND;TZID=America/New_York:20170106T132000
DTSTAMP:20170104T005548Z
DTSTART;TZID=America/New_York:20170106T130000

但是,它们偶尔会这样生成:

DTEND;TZID=America/New_York:20180105T002000
DTSTAMP:20170105T191635Z
DTSTART;TZID=America/New_York;VALUE=DATE:20180105

请特别注意 DTSTART 旁边的 VALUE=DATE:20180105。无论出于何种原因,这都会导致大多数日历应用程序将该事件读取为全天事件(尽管如您在上面所见,我明确表示它不是)。

怎么回事?

编辑:

第一个示例的开始日期为 2017 年 6 月 1 日下午 1 点,第二个示例的开始日期为 2018 年 5 月 1 日凌晨 12 点。我认为这与以下事实有关:在第二个日期时间中,时间是默认值

显然,由于 date + 12AMdate 之后是 0 个滴答,iCal.net 假定您在创建 date 的实例时指的是 date(没有时间) =13=].

如果您查看 new CalDateTime(TimeZoneInfo.ConvertTimeFromUtc(start,TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")), "America/New_York") 上的对象属性,其中 start 是凌晨 12 点,您可以看到 HasTimefalse

还好这个属性是get; set;。所以只需将它设置为true,问题就消失了。