我正在使用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日。我认为这与在第二个日期时间中,时间是默认值
的事实有关答案 0 :(得分:1)
显然,因为date + 12AM
在date
之后为0,所以当您创建date
的实例时,iCal.net会假定您指的是CalDateTime
(没有时间)
如果您查看new CalDateTime(TimeZoneInfo.ConvertTimeFromUtc(start,TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")), "America/New_York")
上午12点start
处的对象属性,您可以看到HasTime
为false
。
幸运的是,此属性为get; set;
。所以只需将其设置为true
,问题就会消失。