PHP中strtotime()处理"Y, F j"格式日期时忽略年份的问题
PHP strtotime()解析"Y, F j"格式日期异常的原因与解决办法
原因说明
strtotime()的日期解析逻辑依赖系统底层的日期处理库,它只对标准日期格式有良好的支持。"Y, F j"(比如2021, October 8)这种格式不属于它能正确识别的标准格式——它会把逗号前的年份当成一个独立的数值,无法和后面的月日关联起来,最终只解析出月日部分,自动用当前年份补全,所以不管你传哪一年,都会返回当前年份对应日期的时间戳。
替代解决方案
方案1:用DateTime::createFromFormat()指定格式解析
这是最可靠的方法,直接告诉PHP要解析的日期格式,完全匹配不会出错:
// 解析指定格式的日期字符串 $date = DateTime::createFromFormat('Y, F j', '2021, October 8'); // 获取时间戳 $timestamp = $date->getTimestamp();
方案2:调整日期字符串为标准格式
把字符串改成strtotime能识别的"F j, Y"格式(比如October 8, 2021),就能正常解析:
$timestamp = strtotime('October 8, 2021');
方案3:手动拆分后用mktime()生成时间戳
如果没法调整原字符串格式,可以手动拆分出年、月、日,再用mktime()生成时间戳:
$dateStr = '2021, October 8'; // 拆分字符串,提取各部分 list($year, $monthDay) = explode(', ', $dateStr); list($monthName, $day) = explode(' ', $monthDay); // 把月份名称转成数字 $month = date('n', strtotime($monthName)); // 生成时间戳 $timestamp = mktime(0, 0, 0, $month, $day, $year);
内容的提问来源于stack exchange,提问作者T.Prasad
相关产品推荐
相关产品推荐

