【问题标题】:Python: Strange behavior of datetime.astimezone with respect to US/Pacific and America/Los_Angeles time zones?Python:datetime.astimezone 相对于 US/Pacific 和 America/Los_Angeles 时区的奇怪行为?
【发布时间】:2012-04-22 06:33:57
【问题描述】:

请注意:

C:\dev\poc\SDR>python
Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pytz import timezone
>>> from datetime import datetime
>>> tz1=timezone('America/Los_Angeles')
>>> tz2=timezone('US/Pacific')
>>> ts1=datetime(2011,8,1,tzinfo=tz1)
>>> ts2=datetime(2011,8,1,tzinfo=tz2)
>>> ts1
datetime.datetime(2011, 8, 1, 0, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)
>>> ts2
datetime.datetime(2011, 8, 1, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>)
>>> ts1.astimezone(tz1)
datetime.datetime(2011, 8, 1, 0, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)
>>> ts2.astimezone(tz2)
datetime.datetime(2011, 8, 1, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>)
>>> ts1.astimezone(tz2)
datetime.datetime(2011, 8, 1, 1, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)
>>> ts2.astimezone(tz1)
datetime.datetime(2011, 8, 1, 1, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PDT-1 day, 17:00:00 DST>)
>>>

这是我不明白的。 US/Pacific (tz1) 和 America/Los_Angeles (tz2) 应该表示同一个时区,不是吗?那为什么datetime.astimezone 要求从一个区域移动到另一个区域会改变时间?

谢谢。

【问题讨论】:

    标签: python datetime timezone


    【解决方案1】:

    夏令时。请注意,最后两个条目列出了 PDT-1

    astimezone 会考虑 DST,但前提是它实际上要经过其全部逻辑。

    您的示例中的前两个astimezone 调用通过完整的逻辑,因为它们短路(因为它们转换“到”的时区已经与它们的时区匹配'正在转换“来自”)。

    (您可能想知道为什么初始日期时间还没有使用 PDT。这是因为 datetime 构造函数 doesn't take into account daylight savings time,即使您将时区传递给它 - 它只是盲目地设置时区。)

    【讨论】:

    • 如果您查看打印件,您还可以看到 16:00:00 STD 和 17:00:00 DST 的位置。
    • 谢谢。给定一个简单的时间值和时区,你如何建议构造一个 datetime 对象?
    • @mark - 如链接页面中所述,要将幼稚的 datetime 转换为本地化的,请使用时区对象的 .localize() 方法。 (基本上,构造一个datetime 对象而不传递tzinfo,然后使用pytz 中的时区对象对其进行本地化。)
    • 谢谢,我再次重读了文档。没错,一切都在那里。再次感谢。
    猜你喜欢
    • 2014-06-08
    • 2020-03-24
    • 2019-09-01
    • 2022-01-24
    • 2015-01-26
    • 2020-09-28
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    相关资源
    最近更新 更多