Я не очень разбираюсь в этом, но мне нужна была функция, которая конвертирует секунды в 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 секунд
Я понимаю, что вы хотите показывать только те значения, которые не равны нулю.
Это потребует немного работы. Вам нужно получить отдельные значения из интервала и посмотреть, равны ли они нулю, и получить только те, которые не равны.
Вы можете поместить эти значения в массив и объединить их, но вам нужно знать, что представляет каждое значение, поэтому вам нужна некоторая форма метки (годы, месяцы и т. Д.).
Вам также нужно будет удалить 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
Других решений пока нет …