我得到的数据中,时间(持续时间)字段以不寻常的格式给出。我认为也给出了时区,但是我不确定为什么。 下面的字符串是一个示例:
PT3165H52M12S
如何在PHP中将小时,分钟和秒提取为整数? 到目前为止,我已经尝试过使用正则表达式,但是我承认失败了。
也许有一个PHP函数可以解决我不知道的问题?
非常感谢您!
答案 0 :(得分:8)
这是DateInterval
表示法。
您可以轻松地将其转换为DateInterval
对象:
$i = new DateInterval('PT3165H52M12S');
print_r($i);
之后,您可以直接访问$i
中的properties,因为它们是公开。
echo $i->h; // shows you `3165` (hours)
echo $i->i; // shows you `52` (mins)
答案 1 :(得分:2)
格式
您未提供ISO 8601格式的日期而是一个句点。在字符串的开头,“ P”代表“句号”,“ T”代表时间,等等。
关于它的文档很多,例如Wikipedia上的这篇文章:https://en.wikipedia.org/wiki/ISO_8601#Durations
解析这段时间
您可以通过实例化一个新的DateInterval
对象来解析此时间段:
var_dump(new \DateInterval("PT3165H52M12S"))
结果将为:
object(DateInterval)#1 (16) {
["y"]=>
int(0)
["m"]=>
int(0)
["d"]=>
int(0)
["h"]=>
int(3165)
["i"]=>
int(52)
["s"]=>
int(12)
["f"]=>
float(0)
["weekday"]=>
int(0)
["weekday_behavior"]=>
int(0)
["first_last_day_of"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
bool(false)
["special_type"]=>
int(0)
["special_amount"]=>
int(0)
["have_weekday_relative"]=>
int(0)
["have_special_relative"]=>
int(0)
}
答案 2 :(得分:2)
首先,如果所有示例都具有小时,分钟和第二部分,则朴素的正则表达式方法将非常简单:
/PT(\d+)H(\d+)M(\d+)S/
每个(\d+)
的意思是“匹配1个或多个数字,并将结果捕获到变量中以供以后使用”,其他所有内容都与文字字符匹配。
第二,如注释中所指出,这是时间间隔,持续时间或时间段的ISO 8601标准表示形式,其分解如下:
由于这是标准,因此它被接受为the DateInterval
class的默认输入,因此您可以简单地编写:
$foo = new \DateInterval('PT3165H52M12S');
然后,您可以使用the properties and methods of that class访问间隔的信息,将其转换为您选择的格式,或者从绝对日期时间添加/减去。