CLI AI

在命令行把 Unix 时间戳转成日期

2026-08-18

date -d @1787043600 打印时间戳对应的日期,date -u -d '2026-08-18 09:00:00' +%s 则反着来。能不能用得上,取决于两个细节:macOS 用 -r 而不是 -d @;毫秒时间戳必须先除以 1000,否则 date 会直接拒收。

1. 时间戳转日期

clai
$ clai 把 1787043600 转成日期→ date -d @1787043600Tue Aug 18 09:00:00 UTC 2026

数字前面的 @ 是必须的——它告诉 date 这是自 1970 年以来的秒数,而不是一个日期字符串。结果按本机时区显示。

2. 明确用 UTC

clai
$ clai 用 UTC 显示 1787043600→ date -u -d @1787043600Tue Aug 18 09:00:00 UTC 2026

不管机器怎么配置,-u 都把输出钉在 UTC 上。在事故沟通里,这是终止"这到底是谁那边几点"争论的唯一办法。

3. 换成指定时区

clai
$ clai 显示这个时间在柏林是几点→ TZ=Europe/Berlin date -d @1787043600Tue Aug 18 11:00:00 CEST 2026

写在命令前面的 TZ 只对这一条命令生效。请用 IANA 名称(Europe/Berlin、America/New_York),不要用 CEST 这类有歧义的缩写。

4. 反过来:日期转时间戳

clai
$ clai 把 2026 年 8 月 18 日 09:00 UTC 转成 unix 时间→ date -u -d '2026-08-18 09:00:00' +%s1787043600

+%s 是"自纪元起的秒数"这个输出格式。不加 -u,日期字符串会按本机时区解析,得到的数字就不一样了。

5. 输出成 ISO 8601

clai
$ clai 用 ISO 格式打印这个时间戳→ date -u -Is -d @17870436002026-08-18T09:00:00+00:00

-Is 是 --iso-8601=seconds 的简写。几乎所有编程语言都能不费力地解析这个格式。

6. 毫秒时间戳

clai
$ 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 是什么时间"变成适合你这台机器的写法,并在执行前先显示出来。一行安装。