time() 返回自 Unix 纪元起的 UTC 秒数,是纯数值无时区信息;显示需用 date() 配合时区设置,计算推荐 DateTime 对象避免夏令时误差。

PHP 中的 time() 返回的是自 Unix 纪元(1970-01-01 00:00:00 UTC)起经过的秒数,不是“公式”,而是一个确定的整数计数方式——理解这一点,就绕开了 90% 的时区和转换困惑。
为什么 time() 返回的数字看起来“没日期感”
因为它是纯数值,不带任何格式或时区信息。你看到的 1717023600 就是某个瞬间,就像秒表读数,本身不说明是几点几分——它只说明“从 1970 年初到现在过了多少秒”。
常见错误现象:
- 用
echo time();后发现输出和系统时间对不上 → 实际是本地时区显示问题,time()本身永远返回 UTC 秒数,没错 - 把
time()直接当“北京时间”用 → 结果晚了 8 小时(UTC+8),因为显示时没做时区转换
实操建议:
- 存储时间一律用
time()或strtotime('now'),它们等价且安全 - 显示时间必须用
date()配合时区设置,例如:date_default_timezone_set('Asia/Shanghai');再调date('Y-m-d H:i:s', time()) - 避免用字符串拼接构造时间戳,比如
strtotime('2024-05-30 12:00:00')比手算秒数可靠得多
strtotime() 是时间戳的“翻译官”,不是万能转换器
它能把人类可读的时间描述转成 time() 类型的整数,但解析逻辑依赖当前时区和模糊规则,容易出偏差。
使用场景:
- 处理用户输入的日期字符串(如表单里的
"next Monday"、"+3 days") - 快速计算相对时间(
strtotime('+1 week'))
容易踩的坑:
-
strtotime('05/30/2024')在不同地区可能被当成MM/DD/YYYY或DD/MM/YYYY→ 改用明确格式:strtotime('2024-05-30') - 未设时区时,
strtotime('12:00')默认按服务器本地时区解析,但服务器可能是 UTC → 先设date_default_timezone_set() - 传入空字符串或非法格式返回
false,不是 0 → 记得判断:$ts = strtotime($input); if ($ts === false) { /* 处理错误 */ }
时间戳比较和计算:别用减法硬算“几天前”
两个时间戳相减得到的是秒数差,直接除以 86400(24×60×60)看似合理,但会因夏令时、闰秒或跨月天数不均而出错。
正确做法:
- 简单间隔(如“是否超过 1 小时”):用秒差判断更准,
if (time() - $old_ts > 3600) { ... } - 要精确到“天”“月”级,改用
DateTime对象:$d1 = new DateTime('@'.$ts1); $d2 = new DateTime('@'.$ts2); $diff = $d1->diff($d2); echo $diff->days; - 注意
DateTime('@1717023600')构造时必须加@前缀,否则会被当作本地时间字符串解析
真正难的不是算出一个数字,而是始终分清:哪个值是原始时间戳(UTC 秒数)、哪个是带时区的显示结果、哪个是用于计算的中间态——混用这三者,是绝大多数时间相关 bug 的根源。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











