如何将[YYYY]-[MM]-[DD]T[HH]:[MM]:[SS]+[XXXX]格式时间转为Unix时间戳?
解决带时区时间转Unix时间戳的简便方法
嘿,这个问题我之前踩过坑!别再跟time.mktime较劲了,它本来就不是用来处理带时区时间的,还要补星期、一年中的第几天这些参数,确实太繁琐。给你两个更省心的方案:
方案一:用Python 3.7+自带的datetime.fromisoformat
Python 3.7及以上版本的datetime模块支持直接解析ISO 8601格式的时间,不过需要把你的输入里的+0800改成+08:00(因为fromisoformat要求时区偏移是±HH:MM格式),代码示例:
from datetime import datetime # 你的输入时间字符串 input_dt = "2024-05-20T16:45:30+0800" # 调整时区偏移的格式:把末尾的两位分钟和前面的小时用冒号隔开 formatted_dt = input_dt[:-2] + ":" + input_dt[-2:] # 解析成带时区的datetime对象 dt_obj = datetime.fromisoformat(formatted_dt) # 直接转成Unix时间戳(秒级,浮点数,包含毫秒等小数部分) unix_ts = dt_obj.timestamp() print(unix_ts)
这个方法完全不用管什么星期、一年第几天的参数,datetime对象会自动处理时区,timestamp()方法直接返回从1970-01-01 UTC到该时间的秒数。
方案二:用dateutil.parser兼容低版本Python
如果你的Python版本低于3.7,或者不想手动调整时区格式,可以用python-dateutil库的解析器,它能自动识别几乎所有常见的时间格式,包括你的+HHMM时区偏移:
首先需要安装库:
pip install python-dateutil
然后代码:
from dateutil import parser input_dt = "2024-05-20T16:45:30+0800" # 直接解析,自动处理时区 dt_obj = parser.parse(input_dt) # 转成Unix时间戳 unix_ts = dt_obj.timestamp() print(unix_ts)
为什么time.mktime会报错?
time.mktime要求传入的是本地时间的struct_time元组,这个元组必须包含9个元素(年、月、日、时、分、秒、星期、一年第几天、夏令时标记),而且它完全不处理时区信息——你得先把带时区的时间转成本地时间,还要手动补全那些额外的参数,这才是你报错的原因。所以处理带时区的时间,真的不推荐用它。
内容的提问来源于stack exchange,提问作者Ivo




