不寻常的时间格式PHP(TZ,H,M,S)

时间:2018-09-12 13:17:07

标签: php string datetime

我得到的数据中,时间(持续时间)字段以不寻常的格式给出。我认为也给出了时区,但是我不确定为什么。 下面的字符串是一个示例:

PT3165H52M12S

如何在PHP中将小时,分钟和秒提取为整数? 到目前为止,我已经尝试过使用正则表达式,但是我承认失败了。

也许有一个PHP函数可以解决我不知道的问题?

非常感谢您!

3 个答案:

答案 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标准表示形式,其分解如下:

  • “ P”代表“句号”(以说明这不是绝对日期)
  • “ T”代表“时间”(这是必需的,因为“ M”可以表示月份或分钟,具体取决于其出现的位置)
  • “ 3165H”持续316小时(小时数不超过24小时没有限制)
  • “ 52M”持续52分钟
  • “ 12S”持续12秒

由于这是标准,因此它被接受为the DateInterval class的默认输入,因此您可以简单地编写:

$foo = new \DateInterval('PT3165H52M12S');

然后,您可以使用the properties and methods of that class访问间隔的信息,将其转换为您选择的格式,或者从绝对日期时间添加/减去。