2016-06-25 4 views
6

Ich habe einige Tests durchführen. Hier ist mein Code:Does DDay Ical Bibliothek berechnen wiederkehrende Regeln korrekt?

var systemTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
var icalTimeZone = iCalTimeZone.FromSystemTimeZone(systemTimeZone); 

var startTimeSearch = new DateTime(2015, 9, 8, 0, 0, 0, DateTimeKind.Utc); 
var endTimeSearch = new DateTime(2015, 12, 1, 00, 0, 0, DateTimeKind.Utc); 

var iCalendar = new iCalendar(); 
var pacificTimeZone = _iCalendar.AddTimeZone(icalTimeZone); 

var event = new Event 
{ 
    Summary = "This is an event at 2015-09-08 10:30 PST (2015-09-08 17:30 UTC)", 
    DTStart = new iCalDateTime(2015, 9, 8, 10, 30, 0, pacificTimeZone.TZID, iCalendar), 
    Duration = new TimeSpan(0, 1, 0, 0) 
}; 

var rp = new RecurrencePattern("FREQ=WEEKLY;UNTIL=20151112T080000Z;WKST=SU;BYDAY=TU"); 

event.RecurrenceRules.Add(rp); 
iCalendar.Events.Add(_event); 
var occurrences = iCalendar.GetOccurrences(startTimeSearch, endTimeSearch); 

Hier ist das Ergebnis:

10 Vorkommnissen - hier sind die Vorkommen Period.StartTime.Value und UTC Eigenschaften

Wert - 9/8/2015 10:30:00 - UTC 9/8/2015 17:30:00
Wert - 9/15/2015 10:30:00 - UTC 9/15/2015 17:30:00
Wert - 2015.09.22 10.30.00 - UTC 9/22/2015 17:30:00
Wert-9/29/2015 10.30.00 - UTC 9/29/2015 17:30:00
Wert - 2015.10.06 10.30.00 - UTC 2015.10.06 17: 30:00
Wert - 10/13/2015 10:30:00 - UTC 10/13/2015 1 7:30:00
Wert - 2015.10.20 10.30.00 - UTC 10/20/2015 17:30:00
Wert - 2015.10.27 10.30 Uhr: 00 - UTC 10/27/2015 17:30:00
Wert -11/3/2015 10.30.00 - UTC 2015.11.03 17.30.00 (Dies sollte 18:30:00!)
Wert - 11.10.2015 10:30:00 - UTC 2015.11.10 17.30.00 (dies sollte 18.30.00 SEIN!)

enter image description here

Wie Sie sehen können, sollte die letzten beiden eine UTC-Zeit von 18.30 Uhr haben : 00. Also ich frage mich, ob dies nur die Art und Weise funktioniert DDay Ical und ich sollte nicht zählen auf den UTC Datetime richtig hinzubekommen, oder wenn ich etwas falsch tue.

+0

könnte es etwas mit Sommer zu tun? – Thorarins

Antwort

8

Sie erhalten diese Zeitdifferenz aufgrund Tageslichtsparungen.Eine mögliche Lösung ist die Zeitzone zu erhalten, indem Name Pacific Standard Time

// First load a file containing time zone information for Pacific Standard Time 
var systemTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 

Anstelle dieser Verwendung Systemzeitzone wie

var systemTimeZone = TimeZoneInfo.GetSystemTimeZones().FirstOrDefault(); 

Oder fügen Sie einfach die lokale Zeitzone:

iCalendar iCalendar= new iCalendar(); 
iCalendar.AddLocalTimeZone(); 

Um alle registrierten Zeitzonen zu finden, click here

ReadOnlyCollection<TimeZoneInfo> zones = TimeZoneInfo.GetSystemTimeZones(); 
Console.WriteLine("The local system has the following {0} time zones", zones.Count); 
foreach (TimeZoneInfo zone in zones) 
    Console.WriteLine(zone.Id); 

Ich benutze GetSystemTimeZones() in meinem Code einfach wie

public static void Test1() 
    { 
     var systemTimeZone = TimeZoneInfo.GetSystemTimeZones().FirstOrDefault(); 
     //TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
     var icalTimeZone = iCalTimeZone.FromSystemTimeZone(systemTimeZone); 

     var startTimeSearch = new DateTime(2015, 9, 8, 0, 0, 0, DateTimeKind.Utc); 
     var endTimeSearch = new DateTime(2015, 12, 1, 00, 0, 0, DateTimeKind.Utc); 

     var iCalendar = new iCalendar(); 
     var pacificTimeZone = iCalendar.AddTimeZone(icalTimeZone); 

     var _event = 
     new Event 
     { 
      Summary = "This is an event at 2015-09-08 10:30 PST (2015-09-08 17:30 UTC)", 
      DTStart = new iCalDateTime(2015, 9, 8, 10, 30, 0, pacificTimeZone.TZID, iCalendar), 
      Duration = new TimeSpan(0, 1, 0, 0) 
     }; 

     var rp = new RecurrencePattern("FREQ=WEEKLY;UNTIL=20151112T080000Z;WKST=SU;BYDAY=TU"); 

     _event.RecurrenceRules.Add(rp); 
     iCalendar.Events.Add(_event); 

     var occurrences = iCalendar.GetOccurrences(startTimeSearch, endTimeSearch); 
    } 

, wenn ich es Debug-Ausgabe wie

stack

bekommt hat du die Zeitzone das Ergebnis entsprechend ändern und erhalten. Hoffe es hilft dir.

+0

Danke. Ich bin mir des Problems mit der Sommerzeit bewusst. Wie meine Frage zeigt, bekomme ich die korrekten PST-Werte - es ist die UTC, die falsch ist. Ich sehe nicht, wie deine Antwort mein Problem löst. – richard

+0

Wie ich denke, ist dies genau die Art, wie DDay Ical funktioniert. –

+0

Ok, die Antwort wäre nein, DDay Ical berechnet das Vorkommen nicht korrekt. Ist das korrekt? – richard

1

Don't use dday.ical; Verwenden Sie ical.net.

Dies sollte Ihnen den Einstieg:

var iCalendar = new Calendar(); 

var start = new DateTime(2015, 9, 8, 10, 30, 0); 
var e = new Event 
{ 
    Summary = "This is an event at 2015-09-08 10:30 PST (2015-09-08 17:30 UTC)", 
    DtStart = new CalDateTime(start, "Pacific Standard Time"), 
    Duration = TimeSpan.FromHours(1) 
}; 

var rp = new RecurrencePattern("FREQ=WEEKLY;UNTIL=20151112T080000Z;WKST=SU;BYDAY=TU"); 
e.RecurrenceRules.Add(rp); 
iCalendar.Events.Add(e); 

var startTimeSearch = new DateTime(2015, 9, 8, 0, 0, 0, DateTimeKind.Utc); 
var endTimeSearch = new DateTime(2015, 12, 1, 00, 0, 0, DateTimeKind.Utc); 
var occurrences = iCalendar.GetOccurrences(startTimeSearch, endTimeSearch); 

Ergebnisse:

ical-net-recurrence-result