从“[YYYY] - [MM] - [DD] T [HH]:[MM]:[SS] + [XXXX]”转换为unix时间戳

时间:2018-01-07 14:16:08

标签: python python-3.x datetime datetime-format iso8601

作为功能的一部分,我以 "[YYYY]-[MM]-[DD]T[HH]:[MM]:[SS]+[XXXX]" 格式输入日期和时间加上时区(XXXX与HHMM中的UTC不同)并需要日期和时间作为Unix时间戳。

我目前正在使用time.mktime([CONVERTED TIME]),但最终会使用TypeError: function takes exactly 9 arguments (6 given)。对time.mktime的“工作日”等论点进行编程似乎需要付出很多努力,所以我确信还有一种更好的方法,我还没有找到。

如何做到这一点?

1 个答案:

答案 0 :(得分:1)

这是符合ISO 8601标准的时间戳。有各种各样的图书馆可以帮助这些。但是你的情况是,对于固定格式,你可以使用Python dt.datetime.strptimedatetime.timedelta来计算自纪元以来的秒数:

代码:

def epoch_seconds_from_iso_8601_with_tz_offset(iso_8601):
    """ Convert ISO 8601 with a timezone offset to unix timestamp """
    iso_8601_dt = dt.datetime.strptime(iso_8601[:-5], '%Y-%m-%dT%H:%M:%S')
    utc_at_epoch = dt.datetime(1970, 1, 1)
    epoch_without_tz_offset = (iso_8601_dt - utc_at_epoch).total_seconds()
    tz_offset = 60 * (60 * int(iso_8601[-4:-2]) + int(iso_8601[-2:]))
    if iso_8601[-5] == '-':
        tz_offset = -tz_offset
    return epoch_without_tz_offset - tz_offset

测试代码:

import datetime as dt

t1 = epoch_seconds_from_iso_8601_with_tz_offset('2018-01-07T19:43:15+0000')
t2 = epoch_seconds_from_iso_8601_with_tz_offset('2018-01-07T11:43:15-0800')
epoch = 1515354195

assert epoch == t1 == t2