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

Convert to unix timestamp from "[YYYY]-[MM]-[DD]T[HH]:[MM]:[SS]+[XXXX]"

作为函数的一部分,我以 "[YYYY]-[MM]-[DD]T[HH]:[MM]:[SS]+[XXXX]" 的格式获取日期和时间以及时区的输入(XXXX 是 HHMM 中与 UTC 的差异) 并且需要日期和时间作为 Unix 时间戳。

我目前正在使用 time.mktime([CONVERTED TIME]),但最终使用的是 TypeError: function takes exactly 9 arguments (6 given)。为 'weekday' 等的参数编写一些东西似乎需要付出很多努力。 time.mktime,所以我确信有更好的方法,但我还没有找到。

还能如何做到这一点?

这是一个 ISO 8601 compliant timestamp. There are various libraries which can help with these. But is your case, for a fixed format, you can use Python's dt.datetime.strptime and datetime.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