2

我正在用 C++ 编写一些代码来解析 vCal/iCal 格式,它可以正确处理 UTC 和本地格式,但现在我找到了一个程序,它正在创建这种使用特定时区的更复杂的格式,但我不知道找出如何正确解析它。这是一个示例(对于多行格式感到抱歉,尝试了几件事来修复):

BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:Microsoft CDO for Microsoft Exchange
VERSION:2.0
BEGIN:VTIMEZONE
TZID:(GMT-06.00) Central Time (US & Canada)
X-MICROSOFT-CDO-TZID:11
BEGIN:STANDARD
DTSTART:16010101T020000
TZOFFSETFROM:-0500
TZOFFSETTO:-0600
RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=11;BYDAY=1SU
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010101T020000
TZOFFSETFROM:-0600
TZOFFSETTO:-0500
RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20120709T210422Z
DTSTART;TZID="(GMT-06.00) Central Time (US & Canada)":20120711T110000
SUMMARY:DR Kickoff Call
LOCATION:GoToMeeting Invitation
DTEND;TZID="(GMT-06.00) Central Time (US & Canada)":20120711T120000
DESCRIPTION:Hi Guys
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR

我想将 DTSTART 转换为 UTC。我知道我需要使用 TZOFFSETTO,但是我如何(以稳健的方式)知道我应该使用 STANDARD 还是 DAYLIGHT 值?在下面的示例中,它是今天的日期,应该使用 STANDARD(基于我知道的实际会议时间),但我如何以编程方式知道呢?

我不认为基于偏移量或 TZID 名称做出任何假设是稳健的,因为这些 vCal/iCal 格式并不总是映射到任何标准。遗憾的是,生成应用程序不能只使用 UTC,但不像我可以控制 GoToMeeting.com,它们非常受欢迎,所以我也不能忽略这个问题。

我唯一能看到的可能会告诉我要使用哪个值是 RRULE,但我真的需要根据所有各种可能的 RRULE 值重复 DTSTART 以确定应用哪个值吗?

我的应用程序需要在 WinXP+ 上运行,我不想要求 Outlook 或 CDO 为我解析这些。

4

1 回答 1

-1

实际上,您可以使用 TZID 名称,如此处所述:http: //msdn.microsoft.com/en-us/library/aa563018 (loband).aspx

于 2012-09-07T14:49:01.480 回答