strtotime() 相减得秒数,因其返回unix时间戳(utc秒数),整型相减即秒差;但需确保解析成功且时区一致,否则结果错误。

直接用 strtotime() 转成整数相减,就是秒数 —— 但前提是两个时间都解析成功,且时区一致。
为什么 strtotime() 相减就能得到秒数
PHP 的 strtotime() 返回的是 Unix 时间戳(从 1970-01-01 00:00:00 UTC 开始的秒数),本质是整型。两个整型相减,结果自然就是秒差。
- 只要输入格式能被
strtotime()识别(如"2024-03-15 10:30:00"、"next Monday"、"+2 days"),就可靠 - 注意:如果任一参数解析失败,
strtotime()返回false,参与减法会转成0,导致结果为负数或错误值(比如false - 1234567890得-1234567890) - 默认使用当前脚本时区(
date_default_timezone_get()),若两个时间字符串隐含不同时区(如一个带+0800,一个没写),结果会偏差
遇到相对时间(如“3天前”“下个月”)怎么算
相对时间字符串本身不含绝对时刻,必须和基准时间一起解析才准确。别用 time() 手动加减,交给 strtotime() 处理更稳。
- ✅ 正确:
strtotime("3 days ago")、strtotime("next month", $base_ts) - ❌ 错误:
time() - 3 * 86400—— 忽略夏令时、闰秒、月末天数不均等问题 - ⚠️ 注意:
strtotime("next month")是“下个日历月同日”,不是“+30天”。例如strtotime("next month", strtotime("2024-01-31"))返回 2024-02-29(不是 2024-03-03)
时间字符串带时区偏移时的坑
带显式时区(如 "2024-03-15 12:00:00 +0800")会被 strtotime() 正确转为 UTC 时间戳;但不带时区的字符串(如 "2024-03-15 12:00:00")会按当前默认时区解释 —— 这是最常见的误差来源。
- 检查当前时区:
date_default_timezone_get(),必要时用date_default_timezone_set("Asia/Shanghai")统一 - 强制指定时区更安全:用
DateTime类(如new DateTime("2024-03-15 12:00:00", new DateTimeZone("Asia/Shanghai"))),再调getTimestamp() - 调试技巧:打印两个时间戳值,确认它们是否符合预期(例如
var_dump(strtotime($a), strtotime($b)))
真正难的不是算秒数,而是确保两个字符串被解析成你心里想的那个时刻 —— 尤其当数据来自表单、API 或日志时,格式和时区往往不干净。多打一行 var_dump() 比硬猜快得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











