【问题标题】:How to convert datetime in Pacific timezone to UTC timestamp?如何将太平洋时区的日期时间转换为 UTC 时间戳?
【发布时间】:2012-12-08 22:57:21
【问题描述】:

我在将日期时间转换为 UTC 时间戳时遇到问题。

TS_FMT = '%Y-%m-%d %H:%M:%S'
t = time.strptime('2012-11-20 00:00:00', TS_FMT)
dt = datetime.datetime(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min,
                       t.tm_sec, tzinfo=pytz.timezone('America/Los_Angeles'))

此时dt处于“正确”状态:

datetime.datetime(2012, 11, 20, 0, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)

但是这样做:

>>> time.mktime(dt.timetuple())
1353369600.0

这是 11/19/12 @ 6:00:00pm EST,这意味着时间戳是在假设 UTC 时区而非 PST 时构建的。

我该怎么做才能让时间戳尊重日期时间的时区?

【问题讨论】:

    标签: python date datetime time timestamp


    【解决方案1】:

    time.mktime 相对于系统本地时间,而不是 UTC。您可以通过将纪元计算为两个时区感知日期时间对象之间的时间差来获得正确的值。来自http://docs.python.org/2/library/datetime.html

    有两种日期和时间对象:“naive”和“aware”。

    感知对象对适用的算法和政治时间调整有足够的了解,例如时区和夏令时信息,以相对于其他感知对象定位自身。感知对象用于表示不可解释的特定时刻 [1]。

    一个朴素的对象不包含足够的信息来明确地定位自己相对于其他日期/时间对象。一个简单的对象是否表示协调世界时 (UTC)、当地时间或某个其他时区的时间完全取决于程序,就像特定数字是否表示米、英里或质量取决于程序一样。朴素的对象很容易理解和使用,但代价是忽略了现实的某些方面。

    这可以通过尝试以下方式来举例说明

    >>> dt
    datetime.datetime(2012, 11, 20, 0, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)
    >>> dt - datetime.datetime(1970, 1, 1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can't subtract offset-naive and offset-aware datetimes
    >>> (dt - datetime.datetime(1970, 1, 1, tzinfo=pytz.timezone('America/Los_Angeles'))).total_seconds()
    1353369600.0
    >>> (dt - datetime.datetime(1970, 1, 1, tzinfo=pytz.timezone('UTC'))).total_seconds()
    1353398400.0
    

    【讨论】:

      【解决方案2】:
      from datetime import datetime
      import pytz
      import calendar 
      calendar.timegm(pytz.timezone('America/Los_Angeles').localize(datetime.strptime('2012-11-20 00:00:00', '%Y-%m-%d %H:%M:%S')).utctimetuple())
      

      返回

      1353398400
      

      【讨论】:

        猜你喜欢
        • 2011-03-13
        • 2018-09-15
        • 2021-03-02
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-17
        • 1970-01-01
        相关资源
        最近更新 更多