Unix时间戳到日期转换器:支持12/24小时格式
将Unix时间戳转换为人类可读的日历日期和时间。工具会自动识别输入的时间戳属于秒、毫秒还是微秒精度,无需手动选择单位,并可在12小时制和24小时制之间自由切换显示格式,方便程序员调试服务器日志文件、排查数据库时间字段和检查API接口返回的原始时间戳数据是否正确。
Unix 时间戳转换器
Unix 时间戳是自 1970 年 1 月 1 日(UTC)以来的秒数
转换后的日期和时间
什么是 Unix 时间戳?
Unix 时间戳是自 1970 年 1 月 1 日(UTC/GMT 凌晨)以来经过的秒数,不计算闰秒。它广泛用于 Unix 系统和编程语言中的日期和时间计算。
文档
Unix 时间戳转日期转换器
Unix 时间戳是表示某一特定时刻的数字。它统计自UTC 1970年1月1日 午夜(这一时刻称为 Unix 纪元)起经过的整秒数。本工具把 Unix 时间戳转换为日历日期和钟点时间,可按 24 小时制或 12 小时制显示。结果以运行转换器的设备所设的时区显示。
如何把 Unix 时间戳转换为日期
基本公式很简单:
日期 = Unix 纪元(1970-01-01,00:00:00 UTC)+ 时间戳(以秒为单位)
要将原始秒数转换为日期,只需从1970年1月1日起加上相应的秒数。然后,结果必须拆分为年、月、日、时、分和秒。难点就在于这一步,因为计算必须考虑闰年(闰年会给二月增加一天),以及每个月的天数不同。大多数编程语言都有内置的日期函数,可以自动完成这些计算,因此不需要逐步手算。
算例
以时间戳1609459200为例。
- 除以一天的秒数:1,609,459,200 ÷ 86,400 = 18,628天。
- 从1970年1月1日起往后数18,628天,并在此过程中记录闰年。
- 数到的日期是2021年1月1日。
因此 1609459200 转换为 2021年1月1日 星期五 00:00:00 UTC。星期五这一星期几,同样由天数计数得出。在设为其他时区的设备上,转换器会以当地时间显示同一时刻。例如在纽约(UTC−5),则为 2020年12月31日 星期四下午 7:00:00。
时间戳也可以是负数,表示1970年以前的日期。例如,-86400正好是 Unix 纪元前一天:UTC 时间1969年12月31日00:00:00。
时间戳的精度单位:秒、毫秒和微秒
并非所有系统都以秒为单位计时。此转换器会根据时间戳的位数判断其精度:
| 位数 | 精度 | 示例 |
|---|---|---|
| 10 | 秒 | 1609459200 |
| 13 | 毫秒 | 1609459200000 |
| 16 | 微秒 | 1609459200000000 |
负时间戳因负号多出一位数字,所以 -1609459200(11 位数字)仍按秒读取。其他位数一律按普通秒处理。毫秒和微秒值在应用上述秒公式之前,会先除以 1,000 或 1,000,000。
12小时制和24小时制时间格式
转换器提供两种显示一天中时间的方式。
- 24 小时制从 0 到 23 计时,没有上午或下午标记。在美国常称为军用时间。下午 3:00 写作 15:00。
- 12小时制将小时从1计数到12,午夜至中午使用 AM,中午至午夜使用 PM。24小时制的15:00会转换为3:00 PM。
24小时制在欧洲大部分地区、拉丁美洲和亚洲,以及世界各地的科学、军事和医疗领域都是标准格式。12小时制仍常用于美国、加拿大和其他少数英语国家的日常生活。
日期的支持范围
该转换器接受从 -62135596800 到 253402300799 的任意时间戳(毫秒或微秒先转换为秒)。这涵盖从 1 年 1月1日 到 9999年12月31日(UTC)的每一个日期。超出该范围的时间戳会因过大或过小而无法转换,予以拒绝。
2038年问题
许多较早的计算机系统把 Unix 时间戳存为 32 位有符号整数,最多只能计到 2,147,483,647。这一秒数在纪元之后对应 UTC 2038年1月19日 03:14:07。过了这一时刻,未打补丁的 32 位系统会回绕为负数,把日期读成 1901 年而不是 2038 年。这称为 2038 年问题。它并非影响所有系统:把时间戳存为 64 位数字的现代软件,或像 JavaScript 那样存为普通数字的软件,可以表示 2038 年之后数千年的日期而不会溢出。JavaScript 日期可保存纪元前后各最多 100,000,000 天,可达 275760 年。
Unix 时间戳的常见用途
Unix 时间戳在计算领域随处可见,因为它们占用空间小,且便于比较或排序:
- 数据库行用它们记录一条记录的创建时间或最后修改时间。
- Web 服务器在 HTTP 标头和 Cookie 中使用它们来控制缓存和过期。
- 日志文件为每个事件加上时间戳,以便按顺序排列条目。
- Git 和其他版本控制系统以这种方式记录提交时间。
- Web API 使用它们标记数据生成或最后更新的时间。
常见问题
什么是 Unix 纪元? Unix 纪元是 UTC 1970年1月1日 的午夜。它是所有 Unix 时间戳计数的零点。
Unix 时间戳包含闰秒吗? 不包含。Unix 时间每天恰好计 86,400 秒,忽略偶尔加入 UTC 的闰秒,因此与天文时间会有轻微偏差。
Unix 时间戳可以为负吗? 可以。负值表示 1970年1月1日 之前的日期。
为什么我的时间戳有 13 位而不是 10 位?
13 位的时间戳以毫秒而非秒计量。JavaScript 的 Date.now()返回自纪元起经过的毫秒数,许多网络 API 也是如此,所以 13 位的值在 Web 开发中很常见。
Unix 时间戳在每个时区都相同吗? 相同。数字本身与任何时区无关;它始终以 UTC 计算自纪元起的秒数。把它转换为当地日期和时间,例如“东部时间下午 3:00”,需要在原始时间戳之上加上时区偏移。
该转换器能处理的最大日期是什么? 9999年12月31日 23:59:59 UTC,对应的时间戳为 253402300799。
参考文献
- The Open Group。The Open Group Base Specifications Issue 8, Chapter 3: Definitions。POSIX 定义:纪元——纪元是 UTC 1970年1月1日 00:00:00。
- The Open Group。The Open Group Base Specifications Issue 8, Chapter 4: General Concepts。POSIX:自纪元起的秒数——每天恰好按 86,400 秒计算。
- MDN Web Docs。Date.now()。Date.now() 参考——返回自纪元起经过的毫秒数。
- MDN Web Docs。Date。JavaScript Date 参考——Date 最多可保存距纪元 ±100,000,000 天的时刻,至 275760 年 9月13日。