从dday.ical迁移到ical.net:如何在事件期间使用时区

时间:2016-11-03 16:36:56

标签: c# timezone dday ical-dotnet

我正在将我的应用程序从dday.ical迁移到ical.net并且正在与TimeZones进行斗争。

我设法重写了从

添加TimeZone
LLONG_MAX

到ical.net等价物

LLONG_MIN

但我不知道如何在ical.net中使用TimeZone

我使用TimeZone的dday.ical代码是

IICalendarCollection calendarCollection = iCalendar.LoadFromUri(new Uri(GoogleCalendarUrl));
IICalendar calendar = calendarCollection.FirstOrDefault();
string timeZone = "<some timezone>";
if (!string.IsNullOrWhiteSpace(timeZone))
{
    System.TimeZoneInfo timezoneinfo = System.TimeZoneInfo.FindSystemTimeZoneById(timeZone);
    calendar.AddTimeZone(timezoneinfo);
}

我的代码的目的是阅读一个私人Google日历,其中包含用于加热我家的预定事件(在19:00它应该是19摄氏度等)并使用这些事件来控制加热设备。

Google日历中的活动包含TimeZone&#39;(GMT + 01:00)Amsterdam&#39;。

在DDay.Cal代码中,由于阿姆斯特丹TimeZone,IEvent的StartTime和EndTime的Local属性为一小时。上面的代码通过设置IEvent的StartTime和EndTime属性的TimeZone来修复此问题。这纠正了时间,在这种情况下持续了一个小时。

有谁可以帮助我如何(重新)将所提到的TimeZone的用法写入ical.net等价物?

1 个答案:

答案 0 :(得分:0)

我认为您正在尝试解决dday.ical中存在的错误,但在ical.net中并不存在。

我认为您正试图让您的恒温器根据一组重复规则进行操作。也许类似于&#34;将温度设置为__C在06:00和#34;然后&#34;将温度设置为__C在09:00&#34;这将是日历中的两个事件,每天在工作日重复。也许周末有不同的活动。 (无论如何我都会这样做。)

你会这样做:

var calendar = Calendar.LoadFromStream(new StringReader(icsString)).First();
var searchStart = DateTime.Parse("2006-12-09T07:00:00");
var searchEnd = DateTime.Parse("2007-12-12T23:00:00");
var occurrences = calendar.GetOccurrences(searchStart, searchEnd);

occurrences中的每次出现都有正确的IANA时区(欧洲/阿姆斯特丹),并且会在季节性时钟更改期间做正确的事情。不需要时区解决方法。

icsString(来自Google日历)的内容如下所示,取自ical.net的其中一个单元测试。

BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Test Calendar
X-WR-TIMEZONE:Europe/Berlin
BEGIN:VTIMEZONE
TZID:Europe/Berlin
X-LIC-LOCATION:Europe/Berlin
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTART;TZID=Europe/Berlin:20061211T070000
DURATION:PT3600S
RRULE:FREQ=DAILY;WKST=MO
DTSTAMP:20061223T162148Z
UID:594oeajmftl3r9qlkb476rpr3c@google.com
CLASS:PUBLIC
CREATED:20061215T212453Z
DESCRIPTION:
LAST-MODIFIED:20061215T212453Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Zähne putzen
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR