我正在用C++编写一些代码来解析vCal/iCal格式,它可以正确地处理UTC和local格式,但是现在我发现一个程序正在创建这种使用特定时区的更复杂的格式,而我不知道如何正确地解析它。下面是一个例子(对于多行格式,很抱歉,我尝试了几种方法来修复):
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,但是我如何(以一种健壮的方式)知道我应该使用标准值还是日光值?在下面的示例中,它是今天的日期,应该使用标准(基于我知道的实际会议时间),但我如何在编程上知道这一点?
我不认为基于偏移量或TZID名称做出任何假设是可靠的,因为这些vCal/iCal格式并不总是映射到任何标准。遗憾的是,生成应用程序不能只使用UTC,但我不能控制GoToMeeting.com,它们非常受欢迎,所以我也不能忽视这个问题。
我能看到的唯一可以告诉我应该使用哪个值的东西是RRULE,但是我真的需要基于所有各种可能的RRULE值来重复DTSTART,以确定要应用哪个值吗?
我的应用程序需要在WinXP+上运行,我不想让Outlook或CDO为我解析它们。
发布于 2012-09-07 22:49:01
实际上,您可以使用TZID名称,如下所示:http://msdn.microsoft.com/en-us/library/aa563018(loband).aspx
https://stackoverflow.com/questions/11439948
复制相似问题