为什么将这个日期时间转换为Epoch 30分钟?

时间:2017-12-12 17:29:32

标签: python datetime epoch

我有以下代表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

任何人都知道我在这里失踪了什么?

1 个答案:

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