Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-将整数秒数转换为ISO8601格式_Php_Time_Iso8601 - Fatal编程技术网

PHP-将整数秒数转换为ISO8601格式

PHP-将整数秒数转换为ISO8601格式,php,time,iso8601,Php,Time,Iso8601,所以基本上我有一个秒数的值,我想用ISO8601格式来表示 例如: 90秒将表示为T1M30 到目前为止,我已经做了以下工作: $length = 90; $interval = DateInterval::createFromDateString($length . ' seconds'); echo($interval->format('TH%hM%iS%s')); 其输出为: TH0M0S90 最终构建了这个函数,该函数似乎生成了我需要的值(但它的持续时间限制在一天以内: pub

所以基本上我有一个秒数的值,我想用ISO8601格式来表示

例如:

90秒将表示为T1M30

到目前为止,我已经做了以下工作:

$length = 90;
$interval = DateInterval::createFromDateString($length . ' seconds');
echo($interval->format('TH%hM%iS%s'));
其输出为:

TH0M0S90


最终构建了这个函数,该函数似乎生成了我需要的值(但它的持续时间限制在一天以内:

public function DurationISO8601(){

        $lengthInSeconds = $this->Length;
        $formattedTime = 'T';

        $units = array(
            'H' => 3600,
            'M' => 60,
            'S' => 1
        );

        foreach($units as $key => $unit){
            if($lengthInSeconds >= $unit){
                $value = floor($lengthInSeconds / $unit);
                $lengthInSeconds -= $value * $unit;
                $formattedTime .= $value . $key;
            }
        }

        return $formattedTime;
    }

感谢您,这里是一个ISO8601持续时间字符串生成器。它有一堆难看的垃圾要捕获,根据持续时间范围,从p开始,从T开始,并处理零秒间隔

function iso8601_duration($seconds)
{
  $intervals = array('D' => 60*60*24, 'H' => 60*60, 'M' => 60, 'S' => 1);

  $pt = 'P';
  $result = '';
  foreach ($intervals as $tag => $divisor)
  {
    $qty = floor($seconds/$divisor);
    if ( !$qty && $result == '' )
    {
      $pt = 'T';
      continue;
    }

    $seconds -= $qty * $divisor;    
    $result  .= "$qty$tag";
  }
  if ( $result=='' )
    $result='0S';
  return "$pt$result";
}
一段测试代码,用于驱动函数绕块运行几次:

$testranges = array(1, 60*60*24-1, 60*60*24*2, 60*60*24*60);
foreach ($testranges as $endval)
{
  $seconds = mt_rand(0,$endval);
  echo "ISO8601 duration test<br>\n";
  echo "Random seconds: " . $seconds . "s<br>\n";

  $duration = iso8601_duration($seconds);
  echo "Duration: $duration<br>\n";
  echo "<br>\n";
}

您可能会注意到,我有点不确定月的持续时间代表什么,因为实际的月并不都是相同的大小。我只从天开始计算,所以如果持续时间长,您仍然只能看到高端的天。

这是一个ISO8601持续时间字符串生成器。它有一堆丑陋的junk根据持续时间范围以及处理零秒间隔,以P和T开始捕捉

function iso8601_duration($seconds)
{
  $intervals = array('D' => 60*60*24, 'H' => 60*60, 'M' => 60, 'S' => 1);

  $pt = 'P';
  $result = '';
  foreach ($intervals as $tag => $divisor)
  {
    $qty = floor($seconds/$divisor);
    if ( !$qty && $result == '' )
    {
      $pt = 'T';
      continue;
    }

    $seconds -= $qty * $divisor;    
    $result  .= "$qty$tag";
  }
  if ( $result=='' )
    $result='0S';
  return "$pt$result";
}
一段测试代码,用于驱动函数绕块运行几次:

$testranges = array(1, 60*60*24-1, 60*60*24*2, 60*60*24*60);
foreach ($testranges as $endval)
{
  $seconds = mt_rand(0,$endval);
  echo "ISO8601 duration test<br>\n";
  echo "Random seconds: " . $seconds . "s<br>\n";

  $duration = iso8601_duration($seconds);
  echo "Duration: $duration<br>\n";
  echo "<br>\n";
}

你可能会注意到,我有点不确定月的持续时间代表什么,因为实际的月并不都是相同的大小。我只从天开始计算,所以如果持续时间长,你仍然只能看到高端的天。

那么你的问题是什么?在你说“我怎么做?”,请记住,这样的问题太宽泛,因此将关闭。因此,如果到目前为止您已经编写了任何代码,我强烈建议将其添加到您的问题中。您应该阅读“”.你用60除以结果得到分钟数,你用
%
操作符得到秒数,你把它和一些字符串操作放在一起…更新的问题…@deceze如果你有超过60分钟的时间怎么办?嗯,我有一个函数,但我不能给出答案。我觉得这个问题很难回答gitimate。这只是“如何将时间戳转换为ISO8601持续时间”。维基百科上的规范信息:那么你的问题是什么?在你说“我该怎么做?”,请记住,这样的问题太宽泛,因此将关闭。因此,如果到目前为止您已经编写了任何代码,我强烈建议将其添加到您的问题中。您应该阅读“”.你用60除以结果得到分钟数,你用
%
操作符得到秒数,你把它和一些字符串操作放在一起…更新的问题…@deceze如果你有超过60分钟的时间怎么办?嗯,我有一个函数,但我不能给出答案。我觉得这个问题很难回答gitimate。这只是“如何将时间戳转换为ISO8601持续时间”。有关wikipedia上规范的信息: