在PHP中,如何将毫秒格式化为分钟:秒:毫秒?

19

我有一些毫秒数(例如70370),想要将其显示为分钟:秒:毫秒,即00:00:0000。

在PHP中如何实现?

7个回答

41

不要陷入使用日期函数的误区!你所拥有的是一个时间间隔,而不是日期。天真的方法是像这样做:

date("H:i:s.u", $milliseconds / 1000)

但是因为日期函数用于处理(哇!)日期,所以在处理时间时不会按你想要的方式进行处理 - 它在格式化日期/时间时考虑时区和夏令时等因素。

相反,你可能只需要进行一些简单的数学计算:

$input = 70135;

$uSec = $input % 1000;
$input = floor($input / 1000);

$seconds = $input % 60;
$input = floor($input / 60);

$minutes = $input % 60;
$input = floor($input / 60); 

// and so on, for as long as you require.

如果你确定你的值小于24小时,你仍然可以使用gmdate(),但这仍然是一种hack方法。 - soulmerge

5

如果您正在使用PHP 5.3,您可以使用DateInterval对象:

list($seconds, $millis) = explode('.', $milliseconds / 1000);
$range = new DateInterval("PT{$seconds}S");
echo $range->format('%H:%I:%S') . ':' . str_pad($millis, 3, '0', STR_PAD_LEFT);

你怎么得到$seconds?你必须将$millis转换为$seconds,不是吗? - Julius F
1
如果您在此处使用70370作为$milliseconds,您将得到00:00:70:037...难道70秒不应该增加1分钟吗? - barfoon
1
DateTime类关键在于它不会保留多余的时间单位,这使得它对我来说相当无用。请参见http://sixrevisions.com/web-development/php-dateinterval-class/上的“创建DateInterval对象”一文中的说明。 - And Finally

4

当你可以使用数学时,为什么还要费心去使用date()和格式化呢? 如果$ms是你的毫秒数

echo floor($ms/60000).':'.floor(($ms%60000)/1000).':'.str_pad(floor($ms%1000),3,'0', STR_PAD_LEFT);

3

将毫秒转换为格式化时间

<?php
/* Write your PHP code here */
$input = 7013512333;

$uSec = $input % 1000;
$input = floor($input / 1000);

$seconds = $input % 60;
$input = floor($input / 60);

$minutes = $input % 60;
$input = floor($input / 60);

$hour = $input ;

echo sprintf('%02d %02d %02d %03d', $hour, $minutes, $seconds, $uSec);
?>

check demo here : https://www.phprun.org/qCbY2n


1

尝试使用此函数以您喜欢的方式显示毫秒数:

<?php
function udate($format, $utimestamp = null)
{
   if (is_null($utimestamp)) {
       $utimestamp = microtime(true);
   }

   $timestamp = floor($utimestamp);
   $milliseconds = round(($utimestamp - $timestamp) * 1000000);

   return date(preg_replace('`(?<!\\\\)u`', sprintf("%06u", $milliseconds), $format), $timestamp);
}

echo udate('H:i:s.u'); // 19:40:56.78128
echo udate('H:i:s.u', 654532123.04546); // 16:28:43.045460
?>

源代码


顺便说一句 - 我不知道那个 preg_replace 在做什么。看起来很奇怪。 - Dominic Rodger
我猜它只是用实际数字替换未被反斜杠前缀的 u。 - Kamil Szot
如果我是一名数学老师,我会说如果 $utime = NULL,$milliseconds 将返回一个负值? 为什么要将毫秒乘以 100000?如果你想要得到秒、分钟等,你需要进行除法运算。 - Julius F
1
我会确保毫秒部分的格式化使用前导零,例如使用类似于sprintf("%06u", $milliseconds)的方法,否则5毫秒看起来就像0.5。 - Wim
@Wim - 我认为你是正确的。这段代码的作者犯了个错误。即使在他给出的示例中也可以看到。我根据你的评论来更正这个答案,以避免误导未来的观众。 - Kamil Szot

0

正如手册中所述:

u 微秒(自 PHP 5.2.2 起添加) 示例:654321

我们在 date() 函数中有一个 'u' 参数

例如:

if(($u/60) >= 60)
{
$u = mktime(0,($u / 360));
}
date('H:i:s',$u);

0

不,你可以使用CarbonInterval:

use Carbon\CarbonInterval;
...
$actualDrivingTimeString = CarbonInterval::seconds($milliseconds/1000)
  ->cascade()->format('%H:%I:%S');
...

完成了,就是这样


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接