date -d @1787043600 打印时间戳对应的日期,date -u -d '2026-08-18 09:00:00' +%s 则反着来。能不能用得上,取决于两个细节:macOS 用 -r 而不是 -d @;毫秒时间戳必须先除以 1000,否则 date 会直接拒收。
1. 时间戳转日期
$ clai 把 1787043600 转成日期→ date -d @1787043600Tue Aug 18 09:00:00 UTC 2026
数字前面的 @ 是必须的——它告诉 date 这是自 1970 年以来的秒数,而不是一个日期字符串。结果按本机时区显示。
2. 明确用 UTC
$ clai 用 UTC 显示 1787043600→ date -u -d @1787043600Tue Aug 18 09:00:00 UTC 2026
不管机器怎么配置,-u 都把输出钉在 UTC 上。在事故沟通里,这是终止"这到底是谁那边几点"争论的唯一办法。
3. 换成指定时区
$ clai 显示这个时间在柏林是几点→ TZ=Europe/Berlin date -d @1787043600Tue Aug 18 11:00:00 CEST 2026
写在命令前面的 TZ 只对这一条命令生效。请用 IANA 名称(Europe/Berlin、America/New_York),不要用 CEST 这类有歧义的缩写。
4. 反过来:日期转时间戳
$ clai 把 2026 年 8 月 18 日 09:00 UTC 转成 unix 时间→ date -u -d '2026-08-18 09:00:00' +%s1787043600
+%s 是"自纪元起的秒数"这个输出格式。不加 -u,日期字符串会按本机时区解析,得到的数字就不一样了。
5. 输出成 ISO 8601
$ clai 用 ISO 格式打印这个时间戳→ date -u -Is -d @17870436002026-08-18T09:00:00+00:00
-Is 是 --iso-8601=seconds 的简写。几乎所有编程语言都能不费力地解析这个格式。
6. 毫秒时间戳
$ clai 转换毫秒时间戳 1787043600123→ ms=1787043600123; date -u -d @$((ms/1000)) +"%F %T.$((ms%1000))"2026-08-18 09:00:00.123
JavaScript、Java 以及大多数 API 给的都是毫秒。整数除法得到秒,余数补上小数部分——那部分 date 自己是不会生成的。
Gotchas
- date 不认识毫秒。 已验证:
date -u -d @1787043600123回答date: invalid date '@1787043600123'。这个数字不是来自遥远的未来,它是 2026 年乘以一千。 - macOS 上参数不一样。 GNU 是
date -d @1787043600,BSD 和 macOS 是date -r 1787043600。在 Linux 上写的脚本到了 Mac 上会默默打印今天的日期或者直接报错——想到处用同一套语法,就从 Homebrew 装coreutils然后调用gdate。 - 不加
-u就是在往别人的时区里转。 同一个时间戳,在 UTC 服务器和柏林的笔记本上差两个小时,上面已经能看到。写事故报告时永远把时区写死。
Related questions
怎么取当前时间戳? date +%s。要毫秒的话,GNU 有 date +%s%3N;BSD 没有这个格式。
怎么算两个日期之间的差? 都转成秒再相减:2026 年 8 月 11 日到 18 日是 604800 秒,正好一周。
什么是 2038 年问题? 有符号 32 位的秒数字段会在 2038 年 1 月 19 日溢出。64 位系统和现代语言里这事已经了结,但老的二进制格式里还能碰到。
See also
CliAI 会把"1787043600 是什么时间"变成适合你这台机器的写法,并在执行前先显示出来。一行安装。