You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:51:26