下面这些 PHP 示例以 Unix 秒作为通用基准,只有在运行时天然提供毫秒的地方才展示毫秒。复制之前先回答一个简单的问题:下游那个 API 要的是什么单位?

获取当前 Unix 时间

$seconds = time();
$milliseconds = (int) floor(microtime(true) * 1000);

把时间戳转成 UTC

$date = (new DateTimeImmutable("@1700000000"))
  ->setTimezone(new DateTimeZone("UTC"));
echo $date->format(DateTimeInterface::ATOM);

上生产前留意

@ 前缀会用 Unix 时间戳构造 DateTimeImmutable。构造完之后,请显式设置用于显示的时区。

值跨越系统边界时,把单位写进字段名里:createdAtSeconds 和 createdAtMs 是比 createdAt 长了点,但出事故的时候能省下不少猜测。

Frequent questions:

Q: time() 带毫秒吗?
A: 不带,time() 返回的是整数秒。需要小数秒或者要算毫秒时间戳,用 microtime(true)。
Q: 为什么推荐 gmdate() 而不是 date()?
A: gmdate() 按 UTC 格式化时间戳;而 date() 用的是服务器配置的时区,本地开发、容器和生产环境之间可能各不相同。
Q: 怎么核对 PHP 的转换结果?
A: 用 gmdate('c', $timestamp) 转一遍同样的值,在把它用于数据迁移之前,拿它和一个独立的 epoch 转换器或数据库的 UTC 函数对照一下。