【问题标题】:PHP - Convert integer number of seconds to ISO8601 formatPHP - 将整数秒数转换为 ISO8601 格式
【发布时间】:2023-03-26 06:18:02
【问题描述】:

所以基本上我有一个我想以 ISO8601 格式表示的秒数。

例如:

90 秒将表示为 T1M30S

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

$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;
    }

谢谢

【问题讨论】:

  • 那么你的问题是什么?在你说“我该怎么做?”之前,请记住,这样的问题太宽泛了,因此会被封闭。因此,如果您迄今为止编写过任何代码,我强烈建议您将其添加到您的问题中。您应该阅读“how do I ask a good question?”。
  • 你可以通过除以 60 得到分钟数,然后将结果取底,你可以使用 % 运算符得到秒数,你可以通过一些字符串操作将它放在一起......
  • 更新问题...@deceze 如果你有超过 60 分钟的时间怎么办?
  • 嗯我有这个功能,但我不能发布答案
  • 在我看来这个问题是合法的。那只是“如何将时间戳转换为 ISO8601 持续时间”。维基百科上的规格信息:en.wikipedia.org/wiki/ISO_8601#Durations

标签: php time iso8601


【解决方案1】:

这似乎是一个 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 duration test
Random seconds: 0s
Duration: T0S

ISO8601 duration test
Random seconds: 3064s
Duration: T51M4S

ISO8601 duration test
Random seconds: 19872s
Duration: T5H31M12S

ISO8601 duration test
Random seconds: 4226835s
Duration: P48D22H7M15S

您可能会注意到,由于实际月份的大小并不完全相同,因此我不太确定月份的持续时间代表什么。我只从几天下来计算,所以如果你的持续时间很长,你仍然只能看到高端的日子。

【讨论】:

    猜你喜欢
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多