2016-06-25 7 views
6

Я провел несколько тестов. Вот мой код:Библиотека DDay Ical правильно вычисляет повторяющиеся правила?

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

Вот результат:

10 вхождений - вот Period.StartTime.Value и UTC Пропертис вхождений

Значение - 9/8/2015 10:30:00 - UTC 9/8/2015 17:30:00
Ценность - 15/15/2015 10:30:00 - UTC 9/15/2015 17:30:00
Значение - 9/22/2015 10:30:00 - UTC 9/22/2015 17:30:00
Значение - 9/29/2015 10:30:00 - UTC 9/29/2015 17:30:00
Значение - 10/6/2015 10:30:00 - UTC 10/6/2015 17: 30:00
Ценность - 10/13/2015 10:30:00 - UTC 10.10.2015 17:30:00
Значение - 10/20/2015 10:30:00 - UTC 10/20/2015 17:30:00
Значение - 10/27/2015 10:30: 00 - UTC 10/27/2015 17:30:00
Значение -11/3/2015 10:30:00 - UTC 11/3/2015 17:30:00 (это должно быть 18:30:00!)
Ценность - 11/10/2015 10:30:00 - UTC 11/10/2015 17:30:00 (ЭТО ДОЛЖНО БЫТЬ 18:30:00!)

enter image description here

Как вы можете видеть, последние два должны иметь время UTC в 18:30 : 00. Поэтому я задаюсь вопросом, работает ли это так, как работает DDay Ical, и я не должен рассчитывать на то, что он получит UTC datetime правильно, или если я что-то делаю неправильно.

+0

Может ли это иметь какое-то отношение к летнему сбережению? – Thorarins

ответ

8

Вы получаете эту разницу во времени из-за перехода на летнее время.Одно из возможных решений, чтобы не получить часовой пояс по имени Pacific Standard Time

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

Вместо этого часового пояса использование системы как

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

Или просто добавить локальный часовой пояс:

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

Чтобы найти все зарегистрированные часы, 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); 

Я просто использую GetSystemTimeZones() в моем коде, как

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

, когда я отладки он получил получил выход как

stack

вы можете изменить часовой пояс, соответственно, и получить результат. Надеюсь, это поможет вам.

+0

Спасибо. Я знаю проблему с летней экономией. Как показывает мой вопрос, я получаю правильные значения PST - это неправильный формат UTC. Я не понимаю, как ваш ответ решает мою проблему. – richard

+0

Как мне кажется, именно так работает DDay Ical. –

+0

Итак, ответ будет отрицательным, DDay Ical не правильно вычисляет вхождения. Это верно? – richard

1

Don't use dday.ical; используйте ical.net.

Это поможет вам начать:

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

Результаты:

ical-net-recurrence-result