指南
时间戳转 ISO 8601 / RFC 3339(秒/毫秒/纳秒智能识别)
为什么要有这一页
开发和运营常拿到 10/13/16/19 位的时间戳,不确定精度、也不清楚时区。这里提供一页式规则、代码片段与 CTA,到底层工具一步到位。
快速使用(MVP 流程)
- 粘贴时间戳(自动按位数识别精度)。
- 选择时区:
UTC或自定义偏移(如UTC+08:00)。 - 输出 ISO 8601 / RFC 3339,一键复制。
- 需要嵌入代码?下方各语言片段即可。
立即体验:Timestamp → ISO Converter 与 Format Builder。
输入规则与校验
- 位数即精度:10=秒,13=毫秒,16=微秒,19=纳秒。
- 字符限制:仅数字;剔除空格和字母。
- 范围:注意 32 位秒级时间戳 2038 溢出;使用 64 位更安全。
- 时区:默认 UTC;支持
+08:00、-05:30等。 - DST:建议用 UTC 避免夏令时影响;若需本地显示,用 IANA 时区名。
代码片段
JavaScript / Node.js
const detectPrecision = (raw) => {
const len = raw.length;
if (len === 10) return { value: Number(raw) * 1000, unit: "ms" };
if (len === 13) return { value: Number(raw), unit: "ms" };
if (len === 16) return { value: Number(raw) / 1000, unit: "ms" }; // µs -> ms
if (len === 19) return { value: Number(raw) / 1_000_000, unit: "ms" }; // ns -> ms
throw new Error("长度不合法");
};
const toIso = (raw, tz = "UTC") => {
const { value } = detectPrecision(raw);
// 若需固定偏移或 IANA 时区,可用 luxon/temporal,这里先返回 UTC
return new Date(value).toISOString();
};
console.log(toIso("1704067200"));
console.log(toIso("1704067200000"));
Python
from datetime import datetime, timezone, timedelta
def to_iso(raw: str, offset_minutes: int = 0) -> str:
n = len(raw)
if n == 10:
ts = int(raw)
elif n == 13:
ts = int(raw) / 1000
elif n == 16:
ts = int(raw) / 1_000_000
elif n == 19:
ts = int(raw) / 1_000_000_000
else:
raise ValueError("长度不合法")
tz = timezone(timedelta(minutes=offset_minutes))
return datetime.fromtimestamp(ts, tz=tz).isoformat()
Go
package main
import (
"fmt"
"time"
)
func parseEpoch(raw string) (time.Time, error) {
switch len(raw) {
case 10:
sec, _ := time.ParseInt(raw, 10, 64)
return time.Unix(sec, 0).UTC(), nil
case 13:
ms, _ := time.ParseInt(raw, 10, 64)
return time.Unix(0, ms*int64(time.Millisecond)).UTC(), nil
case 16:
us, _ := time.ParseInt(raw, 10, 64)
return time.Unix(0, us*int64(time.Microsecond)).UTC(), nil
case 19:
ns, _ := time.ParseInt(raw, 10, 64)
return time.Unix(0, ns).UTC(), nil
default:
return time.Time{}, fmt.Errorf("长度不合法")
}
}
func main() {
t, _ := parseEpoch("1704067200000")
fmt.Println(t.Format(time.RFC3339))
}
常见坑
- 精度误判:13 位当成秒会得到荒诞的未来日期。
- 缺少时区:默认本地解析会跟随服务器/浏览器时区。
- DST 边界:需要本地化时用 IANA 时区名(如
America/New_York),不要只用偏移。 - 溢出:32 位秒级时间戳 2038 会溢出;改用 64 位。
FAQ
- Q: 不确定是秒还是毫秒?
A: 看位数;若不确定,可在工具里试两种输出,选择落在合理时间范围的结果。 - Q: ISO 8601 必须带 Z 吗?
A:Z代表 UTC,带偏移+08:00也是合法的 ISO 8601 / RFC 3339。 - Q: 想批量转换?
A: 用 Batch Timestamp Converter。