【问题标题】:How do I convert a datetime to a UTC timestamp in Python?如何在 Python 中将日期时间转换为 UTC 时间戳?
【发布时间】:2011-05-02 01:50:53
【问题描述】:

来自http://docs.python.org/library/time.html

time.mktime(t): 这是 localtime() 的反函数。它的论点是 struct_time 或完整的 9 元组(因为 需要 dst 标志;使用 -1 作为 dst 如果未知,则标记)表示 当地时间的时间,而不是 UTC。它 返回一个浮点数,对于 与时间()的兼容性。如果 输入值不能表示为 有效时间,OverflowError 或 将引发 ValueError (其中 取决于是否无效值 被 Python 或底层捕获 C 库)。最早的日期 它可以产生时间的是 平台相关。

这表示您需要在本地时间指定时间元组,而不是 UTC。但是,我想用 UTC 指定;我不想在盒子上使用本地时区。

有什么方法可以从日期时间转到时间戳,其中时间被视为 UTC?当我在时间戳之间进行转换时,我希望能够将所有内容保持在标准化的 UTC 形式(日期时间对象)中。

我希望能够做这样的事情并让 x 和 y 相同:

 y = datetime.datetime.utcfromtimestamp(time.mktime(x.timetuple()))
 x = dateutil.parser.parse('Wed, 27 Oct 2010 22:17:00 GMT')
 stamp = time.mktime(x.timetuple())
 y = datetime.datetime.utcfromtimestamp(stamp)
 x
datetime.datetime(2010, 10, 27, 22, 17, tzinfo=tzutc())
 y
datetime.datetime(2010, 10, 28, 6, 17)

【问题讨论】:

标签: python datetime date time


【解决方案1】:

我想你在找calendar.timegm:

import datetime
import dateutil.parser
import calendar

x = dateutil.parser.parse('Wed, 27 Oct 2010 22:17:00 GMT')
stamp = calendar.timegm(x.timetuple())
y = datetime.datetime.utcfromtimestamp(stamp)
print(repr(x))
# datetime.datetime(2010, 10, 27, 22, 17, tzinfo=tzutc())

print(repr(y))
# datetime.datetime(2010, 10, 27, 22, 17)

【讨论】:

  • 谢谢!这非常有用。 calendar.timegm 没有被当地时区污染。
【解决方案2】:

来自stdlib的email包可以解析rfc 5322格式的时间字符串(以前是rfc 2822,rfc 822):

#!/usr/bin/env python
from datetime import datetime, timedelta
from email.utils import mktime_tz, parsedate_tz

time_tuple = parsedate_tz('Wed, 27 Oct 2010 22:17:00 GMT')
posix_timestamp = mktime_tz(time_tuple)  # integer
utc_time = datetime(*time_tuple[:6])     # naive datetime object
assert utc_time == (datetime(1970, 1, 1) + timedelta(seconds=posix_timestamp))

Python: parsing date with timezone from an email

将表示 UTC 时间的原始日期时间对象转换为 POSIX 时间戳:

posix_timestamp = (utc_time - datetime(1970, 1, 1)).total_seconds()

Converting datetime.date to UTC timestamp in Python

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2021-06-14
    相关资源
    最近更新 更多