You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法解析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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:03:46