Python 为什么要将这个日期时间转换为纪元30分钟?

Python 为什么要将这个日期时间转换为纪元30分钟?,python,datetime,epoch,Python,Datetime,Epoch,我有以下表示UTC时间戳的字符串:2017-12-03T20:38:00.971261Z 我想将其转换为Posix时间戳(即:从纪元开始的秒数) 使用这个在线转换器()我知道答案是1512333480 但当我执行以下代码时,结果会被关闭1800秒--30分钟: >>> temp_time1 = datetime.datetime.strptime('2017-12-03T20:38:00.971261Z', '%Y-%m-%dT%H:%M:%S.%fZ') >>&g

我有以下表示UTC时间戳的字符串:
2017-12-03T20:38:00.971261Z

我想将其转换为Posix时间戳(即:从纪元开始的秒数) 使用这个在线转换器()我知道答案是
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
有人知道我在这里遗漏了什么吗???

您创建了一个新的时间戳,并将其放在欧洲/伦敦时区。这与UTC不同。PyTZ数据库中的欧洲/伦敦时区包括历史偏移量,这些偏移量影响
datetime.datetime()
如何解释时区

只需在已从字符串解析的
datetime
对象上使用:

>>> 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\u time1
datetime对象是时区不可知的,因此
timestamp()
对象已经假定不需要进行时区转换

如果出于任何原因必须首先应用
欧洲/伦敦
时区,则至少使用以应用正确的偏移:

>>> 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
在处理时区感知的
datetime
实例时,添加
UTC
时区:

>>> (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()

那么,如果这应该是UTC时间戳,为什么要使用欧洲/伦敦时区呢?
temp\u time1.timestamp()
生成
1512333480.971261
。datetime对象上没有方法timestamp()。我完全搞糊涂了吗Martijn?但有这样一种方法;在我的回答中,我链接到了它的文档。啊,它在Python 3.3中是新的。您是否正在使用Python2?
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()