来自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)
答案 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)
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()