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

时间:2010-10-28 19:14:27

标签: python datetime date time

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

  

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

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

有什么方法可以从datetime到时间戳,时间被视为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 :(得分: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)

答案 1 :(得分: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: 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