【问题标题】:Unusual time format PHP (TZ,H,M,S)不寻常的时间格式 PHP (TZ,H,M,S)
【发布时间】:2018-09-12 13:17:07
【问题描述】:

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

PT3165H52M12S

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

是否有一个我不知道的 PHP 函数可以帮助解决这个问题?

非常感谢您!

【问题讨论】:

  • 这是ISO 8601 格式。不确定我会称之为不寻常。 PHP DateTime 类可能会原生处理它。
  • 哦,这是一个 Duration 字符串 不是 一次 - 我认为我需要更仔细地阅读这个问题 :)
  • 这也是DateInterval 接受的确切格式。
  • @jeroen - 我怀疑是 OP 只是误解了字符串并将其读取为奇怪的时间戳......我最初犯了同样的错误 *whistles 无辜*跨度>
  • @user2228716 我什至没有想到 :-)

标签: php string datetime


【解决方案1】:

这是DateInterval 符号。

您可以简单地将其转换为DateInterval 对象:

$i = new DateInterval('PT3165H52M12S');
print_r($i);

之后您可以直接访问$i 中的properties,因为它们是public

echo $i->h;  // shows you `3165` (hours)
echo $i->i;  // shows you `52` (mins)

【讨论】:

  • 这正是我想要的,非常感谢您的帮助!对不起,如果它非常明显......当它允许我时会接受你的回答
【解决方案2】:

格式

您提供的不是日期,而是 ISO 8601 格式的句点。在字符串的开头,“P”代表“句号”,“T”代表时间,等等。

有很多关于它的文档,比如维基百科上的这篇文章: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) }

【讨论】:

    【解决方案3】:

    首先,如果所有示例都有小时、分钟和秒部分,那么简单的正则表达式方法将非常简单:

    /PT(\d+)H(\d+)M(\d+)S/
    

    每个(\d+) 表示“匹配1个或多个数字,并将结果捕获到变量中以供以后使用”,其他所有内容都只是匹配文字字符。

    其次,正如 cmets 中所指出的,这是时间间隔、持续时间或周期的 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 访问间隔信息,将其转换为您选择的格式,或从绝对日期时间添加/减去它。

    【讨论】:

    • 另一个非常棒的答案,非常感谢您的帮助
    猜你喜欢
    • 2019-01-01
    • 2022-12-06
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多