使用Carbon解析日期2021-11-03T16:57:18.000 00:00失败的问题求助
解决Carbon解析
2021-11-03T16:57:18.000 00:00失败的问题 我来帮你拆解下问题根源,以及对应的解决办法:
为什么两种方式都会报错?
Carbon::createFromFormat('Y-m-d H:i:s', $cerValidTo)抛出Unexpected data found. Trailing data
你指定的格式Y-m-d H:i:s只能匹配「年-月-日 时:分:秒」的结构,但你的日期字符串里多了三个关键内容:- 日期和时间之间的字面量
T - 秒数后的毫秒部分
.000 - 末尾的
00:00(时区偏移,但格式不符合规范)
这些“额外数据”和你指定的格式不匹配,所以Carbon会提示存在多余内容。
- 日期和时间之间的字面量
Carbon::parse($cerValidTo)触发Double time specification
你的字符串格式不符合标准ISO8601规范——正确的UTC时区偏移应该是+00:00或Z,而你这里用空格分隔了时间和00:00。DateTime解析器会把空格后的00:00误认为是第二个时间片段,所以抛出“重复时间指定”的错误。
可行的解决方案
方案1:修正为标准ISO8601格式(推荐)
把字符串里的空格替换成+,转换成Carbon能直接识别的标准格式:
$cerValidTo = str_replace(' ', '+', '2021-11-03T16:57:18.000 00:00'); $date = Carbon::parse($cerValidTo);
修改后字符串变成2021-11-03T16:57:18.000+00:00,属于标准带时区的ISO8601格式,parse方法可以直接解析。
方案2:用createFromFormat匹配原字符串的精确格式
如果无法修改原始字符串,可以指定完全匹配的格式规则:
// 针对固定末尾是00:00的情况 $date = Carbon::createFromFormat('Y-m-d\TH:i:s.u 00:00', '2021-11-03T16:57:18.000 00:00'); // 如果时区偏移可能变化,先把空格转成+再用通用格式匹配 $formattedStr = str_replace(' ', '+', '2021-11-03T16:57:18.000 00:00'); $date = Carbon::createFromFormat('Y-m-d\TH:i:s.u P', $formattedStr);
其中\T用来匹配字面量T,u匹配毫秒部分,P匹配带符号的时区偏移(比如+00:00)。
内容的提问来源于stack exchange,提问作者Bilal Maqsood
相关产品推荐
相关产品推荐

