从白天迁移.如何在“事件周期”中使用时区
本文关键字:事件周期 时区 周期 事件 迁移 白天 | 更新日期: 2023-09-27 18:16:23
我正在从dday迁移我的应用程序。我正在为时区问题而挣扎。
我设法重写了从
添加TimeZoneIICalendarCollection 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等效的
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中使用时区
我dday。使用TimeZone的代码是
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:00它应该是19摄氏度等),并使用这些事件来控制加热设备。
Google Calendar中的事件的时区为'(GMT+01:00) Amsterdam'。
In the DDay。调用代码的本地属性的开始时间和结束时间为一个小时的事件,因为阿姆斯特丹时区。上面写的代码通过设置IEvent的StartTime和EndTime属性的TimeZone来解决这个问题。这修正了时间,在本例中修正了一个小时。
有没有人可以帮助我如何(重新)将提到的使用时区的ical.net等效?
我想你是在试图解决一个存在于dday中的bug。Ical,但在ical.net中不存在
我想你是想让你的恒温器根据一组递归规则做一个动作。比如"在06:00将温度设置为__C",然后"在09:00将温度设置为__C",这将是每天在工作日重复的日历中的两个事件。也许周末会有不同的活动。(反正我也会这么做。)
你可以这样做:
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 Calendar)的内容如下,摘自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