You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

strtotime解析带后缀日期文本返回当前年份的问题及解决方法

问题原因与解决办法

首先得明确问题根源:strtotime() 对带序数后缀(th/st/nd/rd)的非标准日期字符串支持并不理想。你用的 "20th Dec, 2016" 格式,它没能正确识别后面的年份部分,直接 fallback 到了当前年份(也就是你测试时的2018年),这才导致返回了错误的时间戳。而 yyyy-mm-dd 是ISO标准日期格式,strtotime() 对这种格式的解析逻辑非常成熟,所以不会出问题。

下面给你两种靠谱的解决思路:

方法一:先移除序数后缀再解析

用正则表达式把日期中的序数后缀去掉,转换成 strtotime() 能正确识别的格式:

$sd = "20th Dec, 2016";
// 匹配并移除数字后的序数后缀
$cleanedDate = preg_replace('/(\d+)(st|nd|rd|th)/', '$1', $sd);
// 此时解析就正常了
echo strtotime($cleanedDate); // 输出 1482201600,对应2016-12-20的时间戳

方法二:用DateTime类精准指定格式解析

如果你的日期格式是固定的,更推荐用 DateTime::createFromFormat(),它可以明确告诉PHP日期的格式规则,比 strtotime() 更可控、更可靠:

$sd = "20th Dec, 2016";
// 指定格式:jS代表带后缀的日,M代表月份缩写,Y代表四位年份
$date = DateTime::createFromFormat('jS M, Y', $sd);
// 获取时间戳
echo $date->getTimestamp(); // 同样输出1482201600

个人更倾向第二种方法,因为它完全规避了strtotime()对模糊格式的解析风险,处理非标准日期时稳定性更高。

内容的提问来源于stack exchange,提问作者Zeeshan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:44:11