当前位置: 首页 > 知识库问答 >
问题:

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

顾涵衍
2023-03-14

所以基本上我有一个秒数的值,我想用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;
    }

谢啦

共有1个答案

巫马心水
2023-03-14

下面是一个 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

您可能会注意到,我有点不确定几个月的持续时间代表什么,因为实际的月份并不都是相同的大小。我只计算了向下的天数,所以如果你有一个很长的持续时间,你仍然只能看到高端的天数。

 类似资料:
  • 问题内容: 如何转换此 格式 ( ISO8601格式 ): 2014-03-13T09:05:50.240Z 为此( MySQL DATE格式 ): 2014-03-13 在PHP中? 问题答案: 尝试这个 完整的日期功能文档可以在这里找到:http : //php.net/manual/en/function.date.php PHP函数“ strtotime”不执行任何其他操作,然后将您的时间

  • 问题内容: 有没有一种方法可以使用内置函数在PHP中将指数数转换为整数?格式化功能? 1.2378147769392E + 14至123781477693917 问题答案: number_format(1.2378147769392E+14,0,’‘,’‘) 但是,要处理大量数字,如果要保持精度,应该研究BCMath扩展

  • 问题内容: 关于 Swift中的 时间转换,我有一个(有点?)基本问题。 我有一个整数,希望将其转换为小时/分钟/秒。 示例: 会给我: 我知道如何在PHP中执行此操作,但是可惜,Swift不是PHP :-) 我如何迅速实现这一目标的任何技巧都太棒了!先感谢您! 问题答案: 定义 用 要么 上面的函数利用Swift元组一次返回三个值。您可以使用语法对元组进行解构,或者可以根据需要访问单个元组成员。

  • 问题内容: 我有时间差 现在,我如何找到经过的总秒数?不算数天。我可以做: 有内置的方法吗? 问题答案: 使用。

  • 问题内容: 我正在使用以下内容打印时间戳: 但是我想将微秒四舍五入到小数点后两位,而不是打印出小数点后六位。有没有比所有时间元素“拆包”,将微秒格式化并将其四舍五入到小数点后两位以及格式化新的“打印字符串”更简单的方法了? 问题答案:

  • 问题内容: 我知道您可以使用格式将秒数转换为。但是,是否有任何实用程序功能可以让我执行相同的转换,但没有几秒钟? 例如,即使是,我也想将秒转换为。换句话说,只需删除秒部分。 将 强烈 倾向于一个答案指向一个效用函数(如果存在的话),而不是一堆家推出算法。 问题答案: 根据可用的信息,您似乎想要格式化基于持续时间的值。对我们来说幸运的是,自Java 8起,现在有了一个包含类的新API 。 不幸的是,