快速自检清单
- 看 位数:10=秒,13=毫秒,16=微秒,19=纳秒。
- 看 字符:只能是数字,去掉空格/标点/字母。
- 看 范围:结果日期要落在合理区间;用 64 位存储。
- 看 时区:先解析为 UTC,再转目标时区。
- 看 DST:若需本地化,用 IANA 时区名避免夏令时缺口。
想立刻验证?打开 Unix Timestamp Converter 或 Batch Converter。
常见报错类型
- 长度错位:13 位当秒 → 远未来日期。
- 非数字:隐藏空格、逗号、字母。
- 超范围:32 位秒级 2038 溢出;负数在部分系统不支持。
- 时区不明:服务器本地时间与预期 UTC 不一致。
- DST 影响:落在缺失的那一小时导致解析失败。
校验与规范化
JAVASCRIPT1// JS:校验 & 归一化为毫秒 2export function normalizeEpoch(raw) { 3 const trimmed = raw.trim(); 4 if (!/^[0-9]+$/.test(trimmed)) throw new Error("仅允许数字"); 5 const len = trimmed.length; 6 if (len === 10) return Number(trimmed) * 1000; 7 if (len === 13) return Number(trimmed); 8 if (len === 16) return Number(trimmed) / 1000; 9 if (len === 19) return Number(trimmed) / 1_000_000; 10 throw new Error("长度不合法"); 11}
PYTHON1# Python:校验并转为 UTC datetime 2from datetime import datetime, timezone 3 4def parse_epoch(raw: str) -> datetime: 5 if not raw.isdigit(): 6 raise ValueError("仅允许数字") 7 n = len(raw) 8 if n == 10: 9 ts = int(raw) 10 elif n == 13: 11 ts = int(raw) / 1000 12 elif n == 16: 13 ts = int(raw) / 1_000_000 14 elif n == 19: 15 ts = int(raw) / 1_000_000_000 16 else: 17 raise ValueError("长度不合法") 18 return datetime.fromtimestamp(ts, tz=timezone.utc)
SQL1-- PostgreSQL:批量标记精度/异常 2SELECT id, ts_raw, 3 CASE 4 WHEN ts_raw ~ '^[0-9]{10}$' THEN 'seconds' 5 WHEN ts_raw ~ '^[0-9]{13}$' THEN 'milliseconds' 6 WHEN ts_raw ~ '^[0-9]{16}$' THEN 'microseconds' 7 WHEN ts_raw ~ '^[0-9]{19}$' THEN 'nanoseconds' 8 ELSE 'invalid' 9 END AS ts_precision 10FROM events 11WHERE ts_raw !~ '^[0-9]{10}$' 12 OR ts_raw::numeric > 32503680000; -- > 3000-01-01 视为异常
修复模板
- 精度修复:按位数缩放到毫秒,再重新解析。
- 清洗字符:去掉空格、逗号后再走正则校验。
- 范围兜底:超出合理窗口(如
<2000或>2100)直接标记为异常。 - 时区修复:先以 UTC 解析,再转到目标偏移或 IANA 时区。
- DST 安全:尽量使用 UTC;若必须本地显示,用 IANA 区而非固定偏移。
FAQ
- 安全默认值是什么? 先解析为 UTC,再输出目标时区。
- 如何避免 2038 问题? 全链路使用 64 位整数,避免 32 位秒级存储。
- 批量清洗怎么做? 正则预过滤 + 位数缩放 + 转换校验;可用 Batch Timestamp Converter。