指南

时间戳转 ISO 8601 / RFC 3339(秒/毫秒/纳秒智能识别)

为什么要有这一页

开发和运营常拿到 10/13/16/19 位的时间戳,不确定精度、也不清楚时区。这里提供一页式规则、代码片段与 CTA,到底层工具一步到位。

快速使用(MVP 流程)

  1. 粘贴时间戳(自动按位数识别精度)。
  2. 选择时区:UTC 或自定义偏移(如 UTC+08:00)。
  3. 输出 ISO 8601 / RFC 3339,一键复制。
  4. 需要嵌入代码?下方各语言片段即可。

立即体验:Timestamp → ISO ConverterFormat 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

相关工具与指南