如何在Python中将日期时间转换为UTC时间戳?

3 投票
2 回答
6187 浏览
提问于 2025-04-16 06:15

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

time.mktime(t):这个函数是 localtime() 的反向函数。它的参数是 struct_time 或完整的 9 元组(因为需要使用夏令时标志;如果不知道夏令时状态,可以用 -1 作为标志),这个参数表示的是本地时间,而不是 UTC 时间。它返回一个浮点数,以便与 time() 兼容。如果输入的值无法表示为有效时间,就会抛出 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)

2 个回答

0

标准库中的 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: 从电子邮件中解析带时区的日期

如果你想把一个表示 UTC 时间的简单日期时间对象转换成 POSIX 时间戳,可以这样做:

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

可以查看 在 Python 中将 datetime.date 转换为 UTC 时间戳

5

我觉得你在找的是 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)

撰写回答