我不是很了解这个,但我需要一个将秒转换为y,m,d,h的函数
function convertSecToTime($sec)
{
$date1 = new DateTime("@0");
$date2 = new DateTime("@$sec");
$interval = date_diff($date1, $date2);
return $interval->format('%y Years, %m months, %d days, %h hours, %i minutes and %s seconds');
// convert into Days, Hours, Minutes
// return $interval->format('%a days, %h hours, %i minutes and %s seconds');
}
print_r(convertSecToTime(500));
它会给出的输出是
0 Years, 0 months, 0 days, 0 hours, 8 minutes and 20 seconds
有人可以帮我修改这个功能,所以它不显示所有的0值,只显示8分钟和20秒
答案 0 :(得分:3)
我知道您希望仅显示非零值。
这需要一些工作。您需要从间隔中获取单个值,并查看它们是否为零,并且仅获取不是的值。
您可以将这些值放在数组上并加入它们,但您需要知道每个值代表什么,因此您需要某种形式的标签(年,月等)。
如果值为s
,您还需要从标签中删除1
,这很简单:您只需要检查值是否为1并获取标签的子字符串没有最后一个字符(substr($str, 0, -1)
)。
然后你可以用逗号加入这些值,但是你不会在最后一个索引中有“和”部分,所以你必须检查数组中是否有多个项并加入最后一个项用“和”字符串。
这是最终结果:
<?php
function convertSecToTime($sec)
{
$date1 = new DateTime("@0");
$date2 = new DateTime("@$sec");
$interval = date_diff($date1, $date2);
$parts = ['years' => 'y', 'months' => 'm', 'days' => 'd', 'hours' => 'h', 'minutes' => 'i', 'seconds' => 's'];
$formatted = [];
foreach($parts as $i => $part)
{
$value = $interval->$part;
if ($value !== 0)
{
if ($value == 1){
$i = substr($i, 0, -1);
}
$formatted[] = "$value $i";
}
}
if (count($formatted) == 1)
{
return $formatted[0];
}
else
{
$str = implode(', ', array_slice($formatted, 0, -1));
$str.= ' and ' . $formatted[count($formatted) - 1];
return $str;
}
}
echo convertSecToTime(500); //8 minutes and 20 seconds
echo convertSecToTime(1500); //25 minutes
echo convertSecToTime(2500); //41 minutes and 40 seconds
echo convertSecToTime(3500); //58 minutes and 20 seconds
echo convertSecToTime(4500); //1 hour and 15 minutes
echo convertSecToTime(5500); //1 hour, 31 minutes and 40 seconds