2016-11-03 5 views
1

私のアプリケーションをdday.icalからical.netに移行していて、TimeZonesで苦労しています。 dday.icalからical.netへの移行:イベント期間にタイムゾーンを使用する方法

は私が

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

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

同等ical.netに

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

からタイムゾーンを追加書き換えるために管理しかし、私はical.netでタイムゾーンを使用する方法について見当もつかない

TimeZoneを使用する私のdday.icalコードは

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. 
    // ... 
} 
です

私のコードの目的は、私の家を暖房するための予定されたイベント(19時には19℃でなければならない)を含む非公開のGoogleカレンダーを読み込み、これらのイベントを使用して暖房装置を制御することです。

Googleカレンダーの予定には、タイムゾーン(GMT + 01:00)アムステルダムが含まれています。

DDay.Calコードで、IEventのStartTimeとEndTimeのLocalプロパティは、アムステルダムのTimeZoneのため1時間オフでした。上記のコードは、IEventのStartTimeおよびEndTimeプロパティのTimeZoneを設定することでこれを修正しました。これにより、この場合1時間の時間が修正されました。

誰でも、上記のTimeZoneの使用方法を(似たように)ical.netに相当するものに書き込む方法を教えてください。

+0

あなたがしようとしていることは明確ではありません。タイムゾーンを騒がすことは終わりの手段ですが、何が終わりですか?あなたが達成しようとしている本物は何ですか?再帰集合を計算する?一連のイベントをあるタイムゾーンから別のタイムゾーンに変換しますか?他に何か? – rianjs

+0

投稿に自分のコードの目的を追加しました。物事を明確にしてくれることを願っています。 – dromer1967

+0

私は、ical.netのタイムゾーンコードを多くリファクタリングしました。その背後ではNodaTimeを使用しているため、以前のdday.icalに比べてタイムゾーンの変換がより高速で正確になるはずです。タイムゾーンを使って何かをする必要がありますか?あなたはおそらくical.netに存在しないdday.icalに存在するバグを回避する方法を尋ねています。もう一度、あなたは何を達成しようとしていますか?サーモスタットが行動を起こす時間を計算しますか?これは再発ルールのセットに基づいていますか? – rianjs

答えて

0

あなたはdday.icalに存在するバグを回避しようとしていますが、ical.netには存在しません。

私はあなたのサーモスタットが一連の繰り返しルールに基づいて行動を起こそうとしていると思います。 「06:00に__Cに夏時間を設定」、「09:00に夏休みを__Cに設定する」のようなものがあります。これは、仕事日に毎日繰り返されるカレンダーの2つのイベントです。たぶん、週末のイベントの異なるセットで。 (それは私がとにかくそれを行うだろう方法です。)

あなたはこのようなことをするでしょう:

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タイムゾーン(ヨーロッパ/アムステルダム)を有しており、正しいことを行いますタイムゾーンの回避策は必要ありません。

(Googleカレンダーの)icsStringの内容は以下のとおりで、ical.netの単体テストの1つから取得しました。

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

私はこのバグを認識していなかったので、おそらく実際にはTimeZoneのために特別なことを行う必要はありません。私はこれをさらに調査しなければならない。私が今見ることができるのは、ical.netに移行した後、再び時間が「オフ」になるということです。しかしおそらく原因は今や別のものです。 – dromer1967

関連する問題