> 时间戳 | 纪元时间 | 转换 <
// 即时将Unix时间戳转换为日期,或将日期转换为时间戳
实时时钟
实时更新的Unix时间戳显示。实时查看当前的epoch时间。
双向转换
将时间戳转换为可读日期,或将日期转换为时间戳。支持两个方向。
多种格式
以ISO 8601、RFC 2822、UTC、本地时间和相对时间格式查看结果。
// 关于UNIX时间戳
Unix时间戳工作原理:
Unix时间戳(也称为epoch时间或POSIX时间)表示自1970年1月1日 00:00:00 UTC(Unix纪元)以来经过的秒数。这个简单的整数值提供了一种通用的、不依赖时区的时间表示方式。
示例:
1711324800 → 2024-03-25T00:00:00.000Z
常见用例:
- >数据库时间戳存储和查询
- >API响应时间字段
- >日志文件时间戳分析
- >调试时间相关问题
- >跨时区时间协调
- >Y2K38问题:32位有符号整数将在2038年1月19日溢出
>> 常见问题
问:什么是Unix时间戳?
答:Unix时间戳是自1970年1月1日 00:00:00 UTC以来经过的秒数。它是计算机科学中普遍使用的简单整数值。
问:什么是epoch时间?
答:Epoch时间是Unix时间戳的另一个名称。“纪元”指的是参考点:1970年1月1日 00:00:00 UTC。
问:什么是Y2038问题?
答:2038年问题(Y2K38)是因为许多系统将Unix时间戳存储为32位有符号整数,只能表示到2038年1月19日 03:14:07 UTC的时间。
问:秒和毫秒时间戳有什么区别?
答:秒级Unix时间戳为10位数(如:1711324800),毫秒级为13位数(如:1711324800000)。
问:Unix时间戳可以是负数吗?
答:可以,负的Unix时间戳表示1970年1月1日之前的日期。例如,-86400表示1969年12月31日。
// 时间戳位数速查表
数一数位数就能判断单位。把秒和毫秒搞混,是日期显示错误最常见的原因。
| 位数 | 单位 | 示例 | 常见来源 |
|---|---|---|---|
| 10 | s | 1711324800 | Unix/Linux, PHP time(), Stripe |
| 13 | ms | 1711324800000 | JavaScript Date.now(), Java |
| 16 | µs | 1711324800000000 | Kafka, Cassandra |
| 19 | ns | 1711324800000000000 | Go UnixNano(), InfluxDB |
// 在代码中获取当前时间戳
JavaScript Math.floor(Date.now() / 1000) Python int(time.time()) PHP time() Go time.Now().Unix() Java Instant.now().getEpochSecond() Ruby Time.now.to_i Bash date +%s
>> 更多问题
问:Unix 时间戳是 UTC 还是本地时间?
答:始终是 UTC。这个整数表示一个绝对时刻,本身不带时区;只有在显示为日期时才会套用时区。建议存储 UTC,展示时再转换为本地时间。
问:为什么我的时间戳显示的日期不对?
答:通常是秒和毫秒混淆:13 位数当作秒会得到约 55000 年,10 位数当作毫秒则会得到 1970 年 1 月。另外请检查时区转换,以及该值是否其实是 Windows FILETIME 或 Excel 日期序列号。
问:闰秒会影响 Unix 时间戳吗?
答:不会。Unix 时间每天固定按 86,400 秒计算,忽略闰秒,闰秒会被重复或平滑分摊(leap smear)。对绝大多数应用已经足够;科学计时请使用 TAI。
问:除了 Unix 还有其他纪元吗?
答:有。NTP 使用 1900-01-01,Windows FILETIME 使用 1601-01-01(以 100 纳秒为单位),Excel 从 1899-12-30 起按天计数,Mac HFS+ 使用 1904-01-01。如果某个值与当前 Unix 数值相差很大,很可能就是这些变体之一。