1. 时间戳解析与标准化

时间戳解析与标准化 学习卡片

任务说明

本案例处理三类常见的时间戳格式:ISO 8601字符串、含时区偏移的字符串、Unix时间戳(秒/毫秒)。目标是将它们统一解析为带时区信息的 datetime 对象,并全部转换为 UTC 标准时区,最终输出标准化结果。

实现方案

使用 Python 标准库 datetime 完成全部解析与转换,不依赖第三方库。核心处理逻辑封装为 parse_to_utc 函数:对字符串输入依次尝试 ISO 格式解析和自定义格式解析;对数值输入按长度区分秒与毫秒。所有解析结果统一附加 UTC 时区后返回。

输入时间戳 "2024-03-15T08:30:00Z" "2024-03-15 16:30:00+08:00" 1710484200 (秒) 1710484200000 (毫秒) parse_to_utc() str → fromisoformat / strptime int/float → 秒(10位) / 毫秒(13位) naive → 假定UTC aware → 保留原时区 统一转换 .astimezone(UTC) → UTC 标准时区 → 标准化 datetime 输出结果(全部为 UTC 时间) 2024-03-15 08:30:00+00:00 2024-03-15 08:30:00+00:00 2024-03-15 08:30:00+00:00(三种输入指向同一时刻)

代码实现

from datetime import datetime, timezone, timedelta

def parse_to_utc(value):
    """
    将多种格式的时间戳解析为 UTC datetime 对象。
    支持:ISO 8601 字符串、含时区偏移字符串、Unix 秒/毫秒时间戳。
    """
    # 数值类型:Unix 时间戳
    if isinstance(value, (int, float)):
        if value > 1e12:  # 毫秒级
            return datetime.fromtimestamp(value / 1000, tz=timezone.utc)
        else:              # 秒级
            return datetime.fromtimestamp(value, tz=timezone.utc)

    # 字符串类型
    s = value.strip()

    # 尝试 ISO 格式(Python 3.11+ 支持 "Z" 后缀)
    try:
        dt = datetime.fromisoformat(s.replace("Z", "+00:00"))
        if dt.tzinfo is None:
            dt = dt.replace(tzinfo=timezone.utc)  # 无时区信息则假定 UTC
        return dt.astimezone(timezone.utc)
    except ValueError:
        pass

    # 自定义格式:兼容 "YYYY-MM-DD HH:MM:SS±HH:MM"
    try:
        dt = datetime.strptime(s, "%Y-%m-%d %H:%M:%S%z")
        return dt.astimezone(timezone.utc)
    except ValueError:
        pass

    # 自定义格式:无时区偏移的日期时间
    try:
        dt = datetime.strptime(s, "%Y-%m-%d %H:%M:%S")
        return dt.replace(tzinfo=timezone.utc)
    except ValueError:
        raise ValueError(f"无法解析时间戳: {value}")

# ---------- 测试样例 ----------
samples = [
    "2024-03-15T08:30:00Z",          # ISO 8601 UTC
    "2024-03-15 16:30:00+08:00",     # 带 +8 偏移
    "2024-03-15 08:30:00",           # 无时区(假定 UTC)
    1710484200,                       # Unix 秒
    1710484200000,                    # Unix 毫秒
]

for s in samples:
    result = parse_to_utc(s)
    print(f"输入: {s!r:<28} → 输出: {result}")

运行与验证

将上述代码保存为 timestamp_parser.py,在 Python 3.8+ 环境中执行 python timestamp_parser.py。程序会遍历 5 个测试样例并打印解析结果。

预期输出(由代码逻辑直接推出):

输入: '2024-03-15T08:30:00Z'      → 输出: 2024-03-15 08:30:00+00:00
输入: '2024-03-15 16:30:00+08:00' → 输出: 2024-03-15 08:30:00+00:00
输入: '2024-03-15 08:30:00'       → 输出: 2024-03-15 08:30:00+00:00
输入: 1710484200                   → 输出: 2024-03-15 08:30:00+00:00
输入: 1710484200000                → 输出: 2024-03-15 08:30:00+00:00

判定标准:所有输出均为 +00:00 时区且时刻一致(08:30 UTC),即证明解析与标准化成功。若某行输出时区不为 UTC 或时间不一致,则说明解析逻辑存在缺陷。