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
相关产品推荐
相关产品推荐

