PHP日期与格式分隔符不一致时date_create_from_format解析失败问题
PHP date_create_from_format 分隔符不匹配导致的解析错误
嘿,这事儿我太清楚了!这是典型的日期格式字符串和输入日期的分隔符不对应引发的解析问题,咱们来拆解细节:
问题复现场景
当你用date_create_from_format()时,如果格式里的分隔符和输入日期的分隔符对不上,就会直接报错:
- 比如用格式
'd.m.Y'去解析带-分隔的日期'29-04-2018' - 或者反过来,用
'd-m-Y'解析带.分隔的'29.04.2018'
这时候调用date_get_last_errors()查看错误详情,会得到这样的输出:
array (size=4) 'warning_count' => int 0 'warnings' => array (size=0) empty 'error_count' => int 4 'errors' => array (size=2) 2 => string 'Unexpected data found.' (length=22) 5 => string 'Unexpected data found.' (length=22)
为啥会这样?
date_create_from_format()是严格匹配格式字符串里的每一个字符的,包括分隔符:
- 格式里写了
.,就要求输入日期对应位置必须是.,如果出现-,就会被判定为“意外数据” - 同理,格式里的
-也要求输入对应位置必须是-,差一点都不行
只有当格式字符串和输入日期用完全一样的分隔符时,解析才能顺利完成,比如:
date_create_from_format('d.m.Y', '29.04.2018')date_create_from_format('d-m-Y', '29-04-2018')
兼容多种分隔符的小技巧
如果你的场景需要兼容不同分隔符的日期输入,可以先对日期字符串做个预处理,统一分隔符后再解析,比如用正则把所有非数字的分隔符换成.:
$inputDate = '29-04-2018'; // 把所有非数字的字符替换成. $normalizedDate = preg_replace('/[^0-9]/', '.', $inputDate); $dateObj = date_create_from_format('d.m.Y', $normalizedDate);
内容的提问来源于stack exchange,提问作者Kirill Ozeritski
相关产品推荐
相关产品推荐

