如何使用格式P0Y0M0D解析持续时间

时间:2015-11-05 03:06:12

标签: php

我正在开发一个webservice,返回一个xml文件,以这种方式格式化持续时间:

P0Y0M0DT5H50M0.000S

在上面的示例中,它表示持续时间为5小时50分钟

是否存在可以读取此时间格式或将其转换为时间戳的php函数? 我尝试使用strtotime()和DateTime对象,但它返回false或致命错误。 谢谢。

2 个答案:

答案 0 :(得分:0)

假设您的模式一致,您可以使用正则表达式匹配:

$timestamp = 'P0Y0M0DT5H50M0.000S';
preg_match('~T(?P<Hours>\d{1,2})H(?P<Minutes>\d{1,2})M(?P<Seconds>\d{1}\.\d{3})S~', $timestamp, $matches);
print_r($matches);

Example:

Array
(
    [0] => T5H50M0.000S
    [Hours] => 5
    [1] => 5
    [Minutes] => 50
    [2] => 50
    [Seconds] => 0.000
    [3] => 0.000
)

答案 1 :(得分:0)

由于我遇到了这个问题,因此尚未提及用于解析ISO间隔的PHP DateInterval class。它不像示例中那样支持小数秒,但否则可以很好地进行解析:

new DateInterval( 'P0Y0M0DT5H50M0S' )

给出以下结果:

    class DateInterval#2425 (15) {
      public $y =>
      int(0)
      public $m =>
      int(0)
      public $d =>
      int(0)
      public $h =>
      int(5)
      public $i =>
      int(50)
      public $s =>
      int(0)
      public $weekday =>
      int(0)
      public $weekday_behavior =>
      int(0)
      public $first_last_day_of =>
      int(0)
      public $invert =>
      int(0)
      public $days =>
      bool(false)
      public $special_type =>
      int(0)
      public $special_amount =>
      int(0)
      public $have_weekday_relative =>
      int(0)
      public $have_special_relative =>
      int(0)