我有以下代表UTC时间戳的字符串:2017-12-03T20:38:00.971261Z
我想将其转换为Posix时间戳(IE:自纪元以来的秒数)
使用此在线转换器(https://www.epochconverter.com/)我知道答案是1512333480
但是当我执行以下代码时,结果会在1800秒到30分钟之间关闭:
>>> temp_time1 = datetime.datetime.strptime('2017-12-03T20:38:00.971261Z', '%Y-%m-%dT%H:%M:%S.%fZ')
>>> ctime = int(datetime.datetime(temp_time1.year,
temp_time1.month,
temp_time1.day,
temp_time1.hour,
temp_time1.minute,
temp_time1.second,
temp_time1.microsecond,
pytz.timezone('Europe/London')).strftime('%s'))
>>> print ctime
1512351480
任何人都知道我在这里失踪了什么?
答案 0 :(得分:4)
您创建了新时间戳并将其置于欧洲/伦敦时区。这与UTC不同。 PyTZ数据库中的欧洲/伦敦时区包括历史偏移,这些影响datetime.datetime()
解释时区的方式。
只需使用您已从字符串中解析的datetime
对象上的datetime.timestamp()
method:
>>> import datetime
>>> temp_time1 = datetime.datetime.strptime('2017-12-03T20:38:00.971261Z', '%Y-%m-%dT%H:%M:%S.%fZ')
>>> temp_time1.timestamp()
1512333480.971261
您的原始temp_time1
日期时间对象与时区无关,因此timestamp()
对象已假设不必进行时区转换。
如果您出于某种原因必须首先应用Europe/London
时区,那么至少使用timezone.localize()
method来应用正确的偏移量:
>>> import pytz
>>> pytz.timezone('Europe/London').localize(temp_time1)
datetime.datetime(2017, 12, 3, 20, 38, 0, 971261, tzinfo=<DstTzInfo 'Europe/London' GMT0:00:00 STD>)
>>> pytz.timezone('Europe/London').localize(temp_time1).timestamp()
1512333480.971261
请参阅How to make an unaware datetime timezone aware in python
对于Python 2和Python 3.0,3.1或3.2,其中datetime.timestamp()
不可用,减去纪元日期:
>>> (temp_time1 - datetime.datetime(1970, 1, 1)).total_seconds()
1512333480.971261
在处理时区感知UTC
个实例时添加datetime
时区:
>>> (pytz.timezone('Europe/London').localize(temp_time1) - datetime.datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()
1512333480.971261
组合成一个功能:
def datetime_to_timestamp(dt, epoch=datetime.datetime(1970, 1, 1)):
if dt.tzinfo is not None:
epoch = pytz.utc.localize(epoch)
return (dt - epoch).total_seconds()