无法解析yyyymmddThhmmss0+0000格式时间,求DateTime实例化方法
问题解答:解析自定义ISO 8601变体时间格式
一、这个时间格式是什么类型?
你拿到的这个格式是无分隔符的ISO 8601变体,和标准ISO 8601的差异点如下:
- 移除了年月日、时分秒之间的分隔符(标准格式是
YYYY-MM-DDTHH:MM:SS,这里是YYYYMMDDTHHMMSS) - 秒位后追加了1位毫秒值(示例里的末尾
0) - 时区部分采用
±HHMM格式(无冒号,标准ISO 8601时区支持±HH:MM或Z)
二、如何正确实例化DateTime?
PHP的DateTime::__construct()默认仅识别标准格式的时间字符串,针对这种自定义格式,推荐两种解决方案:
方法1:使用DateTime::createFromFormat()(最简便)
这个方法允许你手动指定时间字符串的匹配规则,直接完成解析:
$timeString = "20161122T1030090+0000"; // 定义格式规则: // Ymd → 无分隔符的年月日 // \T → 固定的T字符(需转义避免被解析为格式符) // His → 无分隔符的时分秒 // S → 1位毫秒值 // O → ±HHMM格式的时区 $dateTime = DateTime::createFromFormat('Ymd\THisSO', $timeString); // 验证解析结果 if ($dateTime) { // 输出格式化后的时间,比如:2016-11-22 10:30:09 echo $dateTime->format('Y-m-d H:i:s'); } else { // 解析失败时查看错误详情 $errors = DateTime::getLastErrors(); print_r($errors); }
方法2:手动转换为标准ISO 8601格式
如果不想使用createFromFormat,可以拆分原字符串的各个时间片段,拼接成DateTime能识别的标准格式:
$timeString = "20161122T1030090+0000"; // 拆分时间各组成部分 $year = substr($timeString, 0, 4); $month = substr($timeString, 4, 2); $day = substr($timeString, 6, 2); $hour = substr($timeString, 9, 2); $minute = substr($timeString, 11, 2); $second = substr($timeString, 13, 2); $millisecond = substr($timeString, 15, 1); $timezonePrefix = substr($timeString, 16, 3); $timezoneSuffix = substr($timeString, 19, 2); // 拼接成标准ISO格式:2016-11-22T10:30:09.0+00:00 $standardTime = "$year-$month-$dayT$hour:$minute:$second.$millisecond$timezonePrefix:$timezoneSuffix"; // 实例化DateTime $dateTime = new DateTime($standardTime); echo $dateTime->format('Y-m-d H:i:s');
补充提示
如果实际场景中秒后的毫秒位数不固定(比如有时是3位),可以调整createFromFormat的格式符,把S换成u(支持最多6位微秒),或者对应修改字符串拆分逻辑即可。
内容的提问来源于stack exchange,提问作者web hobbit
相关产品推荐
相关产品推荐

