如何使用PHP读取XML节点中带时区的DateTime格式日期
问题原因
你无法读取带时区的日期节点,不是因为节点值中的冒号导致的,核心问题是SimpleXMLElement返回的节点值是SimpleXMLElement对象类型,而非原生字符串,直接赋值或非字符串上下文调用时不会自动输出完整内容。你测试短日期格式时看似正常读取,是因为短值在弱类型输出场景下PHP自动触发了对象的__toString()方法,属于巧合。
解决方案
只需要在读取节点值时显式强转为字符串即可拿到完整的ISO 8601格式日期,PHP原生支持该格式的日期解析,不需要额外处理:
$xml = new XMLReader(); $xml->open('file.xml'); while( $xml->read() ){ if($xml->nodeType == XMLReader::ELEMENT && $xml->nodeType != XMLReader::END_ELEMENT && $xml->name == 'service'){ $inner = new SimpleXMLElement($xml->readOuterXml()); // 显式强转为字符串即可获取完整日期值 $date = (string)$inner->date; // 若后续需要处理日期,可直接用DateTime类解析该格式 $dateInstance = new DateTime($date); // 示例:输出为Y-m-d格式 2018-10-26 // echo $dateInstance->format('Y-m-d'); } }
你可以通过var_dump($inner->date)验证节点类型,确认返回值为对象类型,强转后即可正常使用。
内容的提问来源于stack exchange,提问作者Joao Rennato
相关产品推荐
相关产品推荐

