【问题标题】:Migrating from dday.ical to ical.net: how to use a timezone in Event Period从 dday.ical 迁移到 ical.net:如何在事件期间使用时区
【发布时间】:2017-03-17 08:29:59
【问题描述】:

我正在将我的应用程序从 dday.ical 迁移到 ical.net,并且正在努力使用 TimeZones。

我设法重写添加时区

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 等价物

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 中使用 TimeZone

我使用 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.
    // ...
}

我的代码的目的是读取一个私人的 Google 日历,其中包含为我的房子供暖的计划事件(在 19:00,它应该是 19 摄氏度等),并使用这些事件来控制加热设备。

Google 日历中的事件的时区为“(GMT+01:00) Amsterdam”。

在 DDay.Cal 代码中,IEvent 的 StartTime 和 EndTime 的 Local 属性由于阿姆斯特丹时区而减少了一小时。上面编写的代码通过设置 IEvent 的 StartTime 和 EndTime 属性的 TimeZone 解决了这个问题。这更正了时间,在本例中为一小时。

任何人都可以帮助我如何(重新)将提到的 TimeZone 使用写入 ical.net 等效项吗?

【问题讨论】:

  • 不清楚您要做什么。弄乱时区是达到目的的一种手段,但目的是什么?你想要达到的真正目标是什么?计算一个递归集?将一系列事件从一个时区转换到另一个时区?还有什么?
  • 我在帖子中添加了我的代码的用途。我希望这能让事情变得清晰。
  • 我在 ical.net 中重构了很多时区代码。它在后台使用 NodaTime,因此时区转换应该比 dday.ical 以前的更快、更准确。你确定你需要对时区做任何事情吗?您正在询问如何解决 dday.ical 中存在但 ical.net 中可能不存在的错误。再说一次,你想达到什么目的?计算您的恒温器应该执行操作的时间?这是基于一组重复规则吗?
  • 你已经正确解释了 Rian。我想计算我的恒温器应该根据日历事件执行操作的时间。我不知道你提到的错误。也许不再需要这种解决方法,但是在迁移到 ical.net 之后,时间又是一小时“关闭”。所以也许我的代码出了点问题。我必须对此进行调查。
  • 启动一个新线程“我的 Google 日历中的事件发生的时间比我预期的时间晚了一小时”,代码 sn-ps 显示日历解析、摄取事件和解释时间事件。我怀疑错误出在您的应用程序中,而不是库中。

标签: c# timezone dday ical-dotnet


【解决方案1】:

我认为您正在尝试解决 dday.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 日历)的内容如下,取自 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

【讨论】:

  • 我不知道这个错误,所以也许我确实不需要为 TimeZone 做一些特别的事情。我必须对此进行进一步调查。我现在可以看到的是,在迁移到 ical.net 之后,时间再次“关闭”一小时。但也许现在的原因是别的。
猜你喜欢
  • 2017-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
相关资源
最近更新 更多