为什么 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 + 12AM
在 date
之后是 0 个滴答,iCal.net 假定您在创建 date
的实例时指的是 date
(没有时间) =13=].
如果您查看 new CalDateTime(TimeZoneInfo.ConvertTimeFromUtc(start,TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")), "America/New_York")
上的对象属性,其中 start
是凌晨 12 点,您可以看到 HasTime
是 false
。
还好这个属性是get; set;
。所以只需将它设置为true
,问题就消失了。
我正在使用 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 + 12AM
在 date
之后是 0 个滴答,iCal.net 假定您在创建 date
的实例时指的是 date
(没有时间) =13=].
如果您查看 new CalDateTime(TimeZoneInfo.ConvertTimeFromUtc(start,TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")), "America/New_York")
上的对象属性,其中 start
是凌晨 12 点,您可以看到 HasTime
是 false
。
还好这个属性是get; set;
。所以只需将它设置为true
,问题就消失了。