PHP strtotime解析未来时间返回的时间戳小于当前时间戳问题
问题分析与解决方案
这问题的核心是你对strtotime()的时区处理逻辑理解有偏差——它完全会考虑PHP的默认时区,这就是导致你看到"未来日期时间戳更小"的根本原因。
具体原因拆解
你的服务器时区是GMT+2(date('Z')返回7200,也就是2小时的偏移量),当你调用strtotime("2018-05-15 14:30")时:
- PHP会把这个日期字符串当作GMT+2时区的本地时间来解析
- 然后将其转换为UTC时间戳:GMT+2的14:30 = UTC的12:30
- 对应的时间戳就是1526387400
而你提到的当前GMT(也就是UTC)时间13:26,对应的UTC时间戳是1526390790——显然UTC 12:30的时间戳要比UTC 13:26的小,这就出现了你看到的"未来日期时间戳反而更小"的现象。
解决方案
根据你的需求,这里有几种可靠的处理方式:
1. 明确指定UTC时区解析日期
推荐使用DateTime类(比strtotime更清晰可控),直接指定解析的时区为UTC:
$utcDateTime = new DateTime("2018-05-15 14:30", new DateTimeZone("UTC")); echo $utcDateTime->getTimestamp(); // 输出对应UTC 14:30的时间戳,会大于13:26的时间戳
2. 在日期字符串后添加UTC标识
如果坚持用strtotime,可以在日期末尾加上UTC,告诉PHP这个时间是UTC时区的:
echo strtotime("2018-05-15 14:30 UTC"); // 同样得到UTC 14:30对应的时间戳
3. 临时修改PHP默认时区(谨慎使用)
如果你的业务逻辑大部分依赖UTC时间,可以临时修改默认时区,解析完成后再改回原时区:
// 保存原时区 $originalTimezone = date_default_timezone_get(); // 切换到UTC date_default_timezone_set('UTC'); // 解析日期(此时会当作UTC时间处理) echo strtotime("2018-05-15 14:30"); // 恢复原时区 date_default_timezone_set($originalTimezone);
关键提醒
strtotime()的返回值始终是UTC时间戳,它的解析逻辑会完全遵循PHP当前的默认时区设置。如果你的业务涉及多时区处理,优先使用DateTime和DateTimeZone类,能避免很多时区相关的坑。
内容的提问来源于stack exchange,提问作者ElectricSaga
相关产品推荐
相关产品推荐

