如何在Python中将JavascriptSerializer格式的JSON日期转为datetime?
把JavaScriptSerializer格式的日期转成Python datetime类型
嘿,这个问题我之前处理过不少次,JavaScriptSerializer输出的日期格式(比如 /Date(1620000000000)/ 或者带时区的 /Date(1620000000000+0800)/)确实有点反直觉,但用Python处理起来其实挺 straightforward 的。下面给你两种常用的方案:
方案一:原生Python实现(无需第三方库)
核心思路是提取格式里的毫秒级时间戳,转成Python datetime能识别的秒级时间戳,再转换为datetime对象。
import re from datetime import datetime def js_serializer_date_to_datetime(js_date_str): # 用正则匹配出时间戳和可选的时区偏移 pattern = r'\/Date\((\d+)(?:[+-]\d{4})?\)\/' match_result = re.match(pattern, js_date_str) if not match_result: raise ValueError("输入的字符串不是有效的JavaScriptSerializer日期格式") # 提取毫秒时间戳,转成秒级(Python datetime用秒作为单位) timestamp_ms = int(match_result.group(1)) timestamp_seconds = timestamp_ms / 1000 # 默认转成UTC时间,如果你需要本地时区,把utcfromtimestamp换成fromtimestamp dt_utc = datetime.utcfromtimestamp(timestamp_seconds) # 处理时区偏移(比如+0800这种情况) tz_offset = match_result.group(2) if tz_offset: hours = int(tz_offset[:3]) minutes = int(tz_offset[3:]) tz_delta = datetime.timedelta(hours=hours, minutes=minutes) return dt_utc + tz_delta return dt_utc # 测试示例 test_date_1 = "/Date(1620000000000)/" test_date_2 = "/Date(1620000000000+0800)/" print(js_serializer_date_to_datetime(test_date_1)) # 输出: 2021-05-03 13:20:00 print(js_serializer_date_to_datetime(test_date_2)) # 输出: 2021-05-03 21:20:00
方案二:用第三方库简化操作(推荐)
如果你的项目已经在用 python-dateutil 这类日期处理库,可以用它来更优雅地处理,尤其是时区相关的场景:
首先确保安装了库:
pip install python-dateutil
然后代码实现:
import re from datetime import datetime from dateutil import tz def js_date_to_datetime(js_date_str): match = re.match(r'\/Date\((\d+)([+-]\d{4})?\)\/', js_date_str) if not match: raise ValueError("无效的JavaScriptSerializer日期格式") timestamp_ms = int(match.group(1)) dt_utc = datetime.utcfromtimestamp(timestamp_ms / 1000).replace(tzinfo=tz.UTC) # 处理时区偏移 tz_offset = match.group(2) if tz_offset: # 把偏移字符串转成dateutil的时区对象 tz_obj = tz.tzoffset(None, int(tz_offset[:3])*3600 + int(tz_offset[3:])*60) return dt_utc.astimezone(tz_obj) return dt_utc
注意事项
- JavaScriptSerializer默认输出的是UTC时间戳,所以用
utcfromtimestamp转换会更准确;如果你的场景里是本地时间,记得换成fromtimestamp。 - 对于1970年之前的日期(负数时间戳),Python 3.3+ 已经支持处理,不用担心报错。
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

