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

时间:2017-01-05 19:24:43

标签: c# icalendar

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

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

发生了什么事?

编辑:

开始日期为2017年6月1日,第一个示例为1PM,第二个示例为2018年5月1日。我认为这与在第二个日期时间中,时间是默认值

的事实有关

1 个答案:

答案 0 :(得分:1)

显然,因为date + 12AMdate之后为0,所以当您创建date的实例时,iCal.net会假定您指的是CalDateTime(没有时间)

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

幸运的是,此属性为get; set;。所以只需将其设置为true,问题就会消失。