2016-11-03 8 views
1

Ich migriere meine Anwendung von dday.ical nach ical.net und kämpfe mit TimeZones.Migration von dday.ical zu ical.net: wie man eine Zeitzone im Ereigniszeitraum verwendet

konnte ich die Zeitzone aus neu zu schreiben, das Hinzufügen

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); 
} 

zum ical.net Äquivalent

IICalendarCollection calendarCollection = LoadFromUri(new Uri(GoogleCalendarUrl)); 
ICalendar calendar = calendarCollection.FirstOrDefault(); 
string timeZone = "<some timezone>"; 

if (!string.IsNullOrWhiteSpace(timeZone)) 
{ 
    ((Calendar)calendar).AddTimeZone(new VTimeZone(timeZone)); 
} 

Aber ich habe keine Ahnung, wie die Time-Zone in ical.net verwenden

Mein dday.ical Code für die Verwendung der TimeZone ist

iCalTimeZone timezone = null; 
if (!string.IsNullOrWhiteSpace(TimeZone)) 
{ 
    System.TimeZoneInfo timezoneinfo = System.TimeZoneInfo.FindSystemTimeZoneById(TimeZone); 
    timezone = iCalTimeZone.FromSystemTimeZone(timezoneinfo); 
} 

Occurrence occurrence = <filled from other code part>; 
IEvent iEvent = occurrence.Source as IEvent; 
IPeriod period = occurrence.Period; 
if ((iEvent != null) && (period != null)) 
{ 
    if (!string.IsNullOrWhiteSpace(TimeZone)) 
    { 
     period.StartTime.SetTimeZone(timezone); 
     period.EndTime.SetTimeZone(timezone); 
    } 

    DateTime localStartTime = period.StartTime.Local; 
    DateTime localEndTime = period.EndTime.Local; 
    // Do something with local start and end time. 
    // ... 
} 

Der Zweck meines Codes ist es, einen privaten Google Kalender zu lesen, der geplante Ereignisse zum Heizen meines Hauses enthält (um 19:00 sollte es 19 Grad Celsius usw. sein) und diese Ereignisse zu verwenden, um ein Heizgerät zu steuern.

Die Ereignisse im Google Kalender haben die TimeZone '(GMT + 01: 00) Amsterdam'.

Im DDay.Cal-Code war die Local-Eigenschaft von StartTime und EndTime für ein IEvent aufgrund der Zeitzone von Amsterdam um eine Stunde inaktiv. Der oben beschriebene Code hat dies durch Festlegen der TimeZone der StartTime- und EndTime-Eigenschaften von IEvent behoben. Dies korrigierte die Zeit, in diesem Fall für eine Stunde.

Kann mir bitte jemand helfen, wie man die erwähnte Nutzung der TimeZone auf das ical.net-Äquivalent (re) schreibt?

+0

Es ist nicht klar, was Sie zu tun versuchen. Mit den Zeitzonen zu spielen ist ein Mittel zum Zweck, aber welches Ende? Was ist das wirklich, was du erreichen willst? Einen Wiederholungssatz berechnen? Konvertieren Sie eine Reihe von Ereignissen von einer Zeitzone in eine andere? Etwas anderes? – rianjs

+0

Ich habe den Zweck meines Codes in der Post hinzugefügt. Ich hoffe, das macht die Dinge klar. – dromer1967

+0

Ich habe einen großen Teil des Zeitzonencodes in ical.net umgestaltet. Hinter den Kulissen verwendet es NodaTime, daher sollten Zeitzonen-Konvertierungen schneller und genauer sein als das, was dday.ical vorher getan hat. Sind Sie sicher, dass Sie überhaupt etwas mit Zeitzonen machen müssen? Sie fragen, wie Sie einen Fehler umgehen können, der in dday.ical existiert, der in ical.net wahrscheinlich nicht existiert. Noch einmal, was versuchst du zu erreichen? Berechnen Sie die Zeit, die Ihr Thermostat eine Aktion ausführen soll? Basiert das auf einer Reihe von Wiederholungsregeln? – rianjs

Antwort

0

Ich denke, Sie versuchen, einen Fehler zu umgehen, der in dday.ical existiert, aber nicht in ical.net existiert.

Ich denke, Sie versuchen, Ihren Thermostat eine Aktion basierend auf einer Reihe von Wiederholungsregeln zu tun. Vielleicht etwas wie "Setze die Temperatur auf __C um 06:00 Uhr", dann "Setze die Temperatur auf __C um 09:00 Uhr", was zwei Ereignisse in einem Kalender sein würde, der an Werktagen täglich wiederholt wird. Vielleicht mit einer anderen Reihe von Veranstaltungen am Wochenende. (Das ist, wie ich es doch tun würde.)

Sie würde so tun:

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); 

Jedes Vorkommen in occurrences hat die richtige IANA-Zeitzone (Europe/Amsterdam), und das Richtige tun während der saisonalen Uhr Änderungen .. Es sind keine Zeitzonen Workarounds erforderlich.

Der Inhalt von icsString (der aus Google Kalender stammt) ist unten und stammt aus einem der Komponententests in 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:[email protected] 
CLASS:PUBLIC 
CREATED:20061215T212453Z 
DESCRIPTION: 
LAST-MODIFIED:20061215T212453Z 
LOCATION: 
SEQUENCE:0 
STATUS:CONFIRMED 
SUMMARY:Zähne putzen 
TRANSP:OPAQUE 
END:VEVENT 
END:VCALENDAR 
+0

Ich war mir diesen Fehler nicht bewusst, vielleicht muss ich also für eine TimeZone nichts Besonderes tun. Ich muss das weiter untersuchen. Was ich jetzt sehen kann ist, dass nach der Migration zu ical.net die Zeiten wieder eine Stunde entfernt sind. Aber vielleicht ist die Ursache jetzt etwas anderes. – dromer1967

Verwandte Themen