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

3

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

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

这意味着您需要在本地时间而不是UTC时间中指定时间元组。但是我想要在UTC时间中进行指定;我不想在计算机上使用本地时区。

有没有办法将datetime转换为时间戳,并将其视为UTC时间? 我想在转换为和从时间戳中保持所有内容处于标准化的UTC格式(datetime对象)。

我想做到像这样的事情,并使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)

1
时间戳 = (x - datetime(1970, 1, 1, tzinfo=dateutil.tz.tzutc())).total_seconds() - jfs
2个回答

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)

谢谢!这非常有用。calendar.timegm没有受到本地时区的干扰。 - Themerius

0

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

将表示UTC时间的naive datetime对象转换为POSIX时间戳的方法:

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

请参见 将datetime.date转换为Python中的UTC时间戳

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接