time() 返回自1970-01-01 00:00:00 UTC起的秒级整数时间戳,与本地时区无关,始终基于UTC;其值为int类型,不提供毫秒精度,需用microtime(true)替代。

PHP time() 返回的是 Unix 时间戳
time() 函数返回一个整数,表示从 Unix 纪元(1970-01-01 00:00:00 UTC)到当前时刻的秒数。它不带参数,也不依赖本地时区设置——返回值始终是基于 UTC 的秒数。
常见误解是以为它返回“本地时间”,其实不是:时区只影响 date()、strftime() 这类格式化函数的输出,time() 本身只是个纯数字,没有时区属性。
- 在服务器时区为 CST(UTC+8)的机器上调用
time(),返回值和 UTC 服务器上同一毫秒调用的结果完全一致 - 返回值类型是
int(PHP 8.1+ 可能为int|false,但几乎不会失败) - 若需获取毫秒级精度,不能靠
time(),得用microtime(true)
为什么 time() 返回值有时看起来“不准”
现象:用 time() 获取时间后传给前端,再用 JavaScript Date.now() / 1000 对比,发现差几秒。
这不是 time() 的问题,而是典型的时间同步偏差:
- PHP 执行时刻和 JS 执行时刻不在同一毫秒,网络延迟、脚本执行耗时都会造成差异
- 服务器系统时间未启用 NTP 同步,可能已偏移数十秒(用
ntpstat或timedatectl status检查) - PHP-FPM 或 OPcache 导致脚本被缓存,
time()被意外“固化”(极少,但若配合静态变量或 APCu 缓存时间值就可能)
time() 和 $_SERVER['REQUEST_TIME'] 有什么区别
两者都常用于记录请求开始时间,但来源和精度不同:
-
time()是运行时调用,每次执行都重新取系统时间,适合记录“此刻”的逻辑时间点(如日志打点、超时判断) -
$_SERVER['REQUEST_TIME']是 PHP 在请求初始化时一次性读取并存入的整数秒值,性能略高,但固定不变——哪怕你在脚本末尾读它,值仍是请求开始时的time() - 若需微秒级起始时间,
$_SERVER['REQUEST_TIME_FLOAT']更合适(PHP 5.4+) - 注意:
$_SERVER['REQUEST_TIME']不是所有 SAPI 都支持(如 CLI 下可能不存在)
替代方案:什么时候不该用 time()
当需求超出“秒级 UTC 时间戳”范围时,time() 就不够用了:
- 需要纳秒/毫秒精度(比如性能追踪)→ 改用
hrtime()(PHP 7.3+) - 要处理带时区的日期计算(如“用户所在地今天凌晨0点”)→ 用
DateTime类,而非硬算time()加减 - 做分布式系统全局单调递增 ID →
time()秒级太粗,易冲突,应结合microtime(true)+ 进程 ID + 序列号 - 验证 JWT 过期时间等安全场景 → 必须用
time(),但务必确认服务器时间准确,否则校验会失效
真正容易被忽略的是:time() 的返回值虽简单,但它背后绑定的是系统时钟。一旦服务器时间跳变(如手动修改、NTP 大幅校正),所有依赖它的逻辑都可能出问题——比如缓存过期提前触发、定时任务错乱。这点比函数怎么写更重要。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











