1. 时间戳解析与标准化
任务说明
本案例处理三类常见的时间戳格式:ISO 8601字符串、含时区偏移的字符串、Unix时间戳(秒/毫秒)。目标是将它们统一解析为带时区信息的 datetime 对象,并全部转换为 UTC 标准时区,最终输出标准化结果。
实现方案
使用 Python 标准库 datetime 完成全部解析与转换,不依赖第三方库。核心处理逻辑封装为 parse_to_utc 函数:对字符串输入依次尝试 ISO 格式解析和自定义格式解析;对数值输入按长度区分秒与毫秒。所有解析结果统一附加 UTC 时区后返回。
代码实现
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 或时间不一致,则说明解析逻辑存在缺陷。