gpt4 book ai didi

python - EWS TimeZoneDefinitions : For a timezone, 当前时间如何计算 UTC 偏移量

转载 作者:行者123 更新时间:2023-11-28 22:39:19 26 4
gpt4 key购买 nike

我正在创建一个使用 EWS APIs 的应用程序同步用户的将日历交换到他们的移动设备。从交换服务器获取的日历事件包含此事件的开始时间和结束时间的时区信息。正如解释的那样 here EWS 响应中的时区项表示如下:

      <m:TimeZoneDefinitions>
<t:TimeZoneDefinition Name="(GMT-05:00) Eastern Time (US &amp; Canada)" Id="Eastern Standard Time">
<t:Periods>
<t:Period Bias="PT5H" Name="Standard" Id="trule:Microsoft/Registry/Eastern Standard Time/2006-Standard"/>
<t:Period Bias="PT4H" Name="Daylight" Id="trule:Microsoft/Registry/Eastern Standard Time/2006-Daylight"/>
<t:Period Bias="PT5H" Name="Standard" Id="trule:Microsoft/Registry/Eastern Standard Time/2007-Standard"/>
<t:Period Bias="PT4H" Name="Daylight" Id="trule:Microsoft/Registry/Eastern Standard Time/2007-Daylight"/>
</t:Periods>
<t:TransitionsGroups>
<t:TransitionsGroup Id="0">
<t:RecurringDayTransition>
<t:To Kind="Period">trule:Microsoft/Registry/Eastern Standard Time/2006-Daylight</t:To>
<t:TimeOffset>PT2H</t:TimeOffset>
<t:Month>4</t:Month>
<t:DayOfWeek>Sunday</t:DayOfWeek>
<t:Occurrence>1</t:Occurrence>
</t:RecurringDayTransition>
<t:RecurringDayTransition>
<t:To Kind="Period">trule:Microsoft/Registry/Eastern Standard Time/2006-Standard</t:To>
<t:TimeOffset>PT2H</t:TimeOffset>
<t:Month>10</t:Month>
<t:DayOfWeek>Sunday</t:DayOfWeek>
<t:Occurrence>-1</t:Occurrence>
</t:RecurringDayTransition>
</t:TransitionsGroup>
<t:TransitionsGroup Id="1">
<t:RecurringDayTransition>
<t:To Kind="Period">trule:Microsoft/Registry/Eastern Standard Time/2007-Daylight</t:To>
<t:TimeOffset>PT2H</t:TimeOffset>
<t:Month>3</t:Month>
<t:DayOfWeek>Sunday</t:DayOfWeek>
<t:Occurrence>2</t:Occurrence>
</t:RecurringDayTransition>
<t:RecurringDayTransition>
<t:To Kind="Period">trule:Microsoft/Registry/Eastern Standard Time/2007-Standard</t:To>
<t:TimeOffset>PT2H</t:TimeOffset>
<t:Month>11</t:Month>
<t:DayOfWeek>Sunday</t:DayOfWeek>
<t:Occurrence>1</t:Occurrence>
</t:RecurringDayTransition>
</t:TransitionsGroup>
</t:TransitionsGroups>
<t:Transitions>
<t:Transition>
<t:To Kind="Group">0</t:To>
</t:Transition>
<t:AbsoluteDateTransition>
<t:To Kind="Group">1</t:To>
<t:DateTime>2007-01-01T00:00:00</t:DateTime>
</t:AbsoluteDateTransition>
</t:Transitions>
</t:TimeZoneDefinition>
</m:TimeZoneDefinitions>

我需要的是:从上面的 TimeZoneDefinition XML 来看,目前与 UTC 的时间偏差是多少?

任何人都可以向我解释我应该遵循的算法来计算它。是否有执行此操作的现有库(python)?

最佳答案

有两种选择。第一个是我的首选建议:

  1. 安装 tzlocalpytz包。

  2. 提取 XML 的 Id 元素(或者您可能已经在事件数据中拥有它并且可以消除额外的网络服务调用)。在上面的示例中,Windows 时区 ID 是 “东部标准时间”

    import lxml.etree as et
    xml = et.fromstring(open("in.xml").read())
    windowsTimeZoneId = xml.xpath("//*[local-name() = 'TimeZoneDefinition']/@Id")

    (感谢 Padraic Cunningham 提供上述 XML 提取片段。)

  3. 利用此库中包含的基于 CLDR 的 Windows 到 IANA 映射文件,使用 tzlocal 从 Windows 时区 ID 解析 IANA 时区。

    from tzlocal.windows_tz import win_tz
    ianaTimeZoneId = win_tz.get(windowsTimeZoneId)

    这应该给你 "America/New_York"

  4. 将 pytz 与生成的时区标识符一起使用

    from datetime import datetime
    import pytz
    tz = pytz.timezone(ianaTimeZoneId)
    now = datetime.now(tz)

另一种选择是通过算法解析 XML 以确定相关时间的偏移量。我将向您详细说明所涉及的步骤(如果需要,其他人可以提供代码):

  1. 获取当前日期和时间 - 因为您需要当前偏移量。 (虽然认识到其他日期和时间可能确实不同。)您需要获取与相关时区相关的本地时间,因为这是定义这些规则的基础(仅此一项就可能涉及 pytz 和 tzlocal)。

  2. 检查 Transitions 部分并找到适用的部分。在您的示例中,第一条规则是包罗万象的,第二条规则从 2007 年开始有效,因此第二条规则适用于当前时间。它被标记为第 1 组。

  3. 找到与上一步中的数字相匹配的 TransitionGroup (TransitionGroup Id="1")。根据 MonthDayOfWeekOccurrence 值计算当前年份中的日期。从午夜开始应用 TimeOffset 值以获取转换的时间(00:00 + PT2H == 2 :00 AM 在这种情况下)。

  4. 根据相关日期是在每个过渡日期之前还是之后,确定哪个Period 适用。考虑到在北半球,先过渡到夏令时,然后再过渡到标准时间。在南半球,情况正好相反。这里的逻辑可能会变得棘手,您必须考虑本地时间落入前向“间隙”或在回退“重叠”中出现两次的本地时间的边缘情况。

  5. 使用Period 值的Bias 属性作为偏移量,反转符号。在这种情况下,PT5H 是 UTC-5,PT4H 是 UTC-4。

如您所见,这非常复杂,可能无法在本网站上清楚地写成答案。想要为此编写库的人当然可以通过这些步骤来直接解析 XML 数据的偏移量 - 但第一个选项更容易 - 并且当你认为你拥有完全控制权时更可靠自己更新时区数据。

关于python - EWS TimeZoneDefinitions : For a timezone, 当前时间如何计算 UTC 偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34875594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com