Конвертировать секунды в дни, часы, минуты и секунды - PullRequest
83 голосов
/ 26 ноября 2011

Я хотел бы преобразовать переменную $uptime в секундах в дни, часы, минуты и секунды.

Пример:

$uptime = 1640467;

Результат должен быть:

18 days 23 hours 41 minutes

Ответы [ 20 ]

199 голосов
/ 30 октября 2013

Это может быть достигнуто с DateTime класс

Использование:

echo secondsToTime(1640467);
# 18 days, 23 hours, 41 minutes and 7 seconds

Функция:

function secondsToTime($seconds) {
    $dtF = new \DateTime('@0');
    $dtT = new \DateTime("@$seconds");
    return $dtF->diff($dtT)->format('%a days, %h hours, %i minutes and %s seconds');
}

демо

41 голосов
/ 26 ноября 2011

Эта функция переписана для включения дней. Я также изменил имена переменных, чтобы облегчить понимание кода ...

/** 
 * Convert number of seconds into hours, minutes and seconds 
 * and return an array containing those values 
 * 
 * @param integer $inputSeconds Number of seconds to parse 
 * @return array 
 */ 

function secondsToTime($inputSeconds) {

    $secondsInAMinute = 60;
    $secondsInAnHour  = 60 * $secondsInAMinute;
    $secondsInADay    = 24 * $secondsInAnHour;

    // extract days
    $days = floor($inputSeconds / $secondsInADay);

    // extract hours
    $hourSeconds = $inputSeconds % $secondsInADay;
    $hours = floor($hourSeconds / $secondsInAnHour);

    // extract minutes
    $minuteSeconds = $hourSeconds % $secondsInAnHour;
    $minutes = floor($minuteSeconds / $secondsInAMinute);

    // extract the remaining seconds
    $remainingSeconds = $minuteSeconds % $secondsInAMinute;
    $seconds = ceil($remainingSeconds);

    // return the final array
    $obj = array(
        'd' => (int) $days,
        'h' => (int) $hours,
        'm' => (int) $minutes,
        's' => (int) $seconds,
    );
    return $obj;
}

Источник: CodeAid () - http://codeaid.net/php/convert-seconds-to-hours-minutes-and-seconds-(php)

20 голосов
/ 13 мая 2017

Основано на ответе Джулиана Морено, но изменено, чтобы дать ответ в виде строки (не массива), только включать требуемые интервалы времени и не принимать множественное число.

Разница между этим и самым высоко оцененным ответом:

В течение 259264 секунд этот код даст

3 дня, 1 минута, 4 секунды

В течение 259264 секунд ответ с наибольшим количеством голосов (по словам Главича) даст

3 дня, 0 часов , 1 минута с и 4 секунды

function secondsToTime($inputSeconds) {
    $secondsInAMinute = 60;
    $secondsInAnHour = 60 * $secondsInAMinute;
    $secondsInADay = 24 * $secondsInAnHour;

    // Extract days
    $days = floor($inputSeconds / $secondsInADay);

    // Extract hours
    $hourSeconds = $inputSeconds % $secondsInADay;
    $hours = floor($hourSeconds / $secondsInAnHour);

    // Extract minutes
    $minuteSeconds = $hourSeconds % $secondsInAnHour;
    $minutes = floor($minuteSeconds / $secondsInAMinute);

    // Extract the remaining seconds
    $remainingSeconds = $minuteSeconds % $secondsInAMinute;
    $seconds = ceil($remainingSeconds);

    // Format and return
    $timeParts = [];
    $sections = [
        'day' => (int)$days,
        'hour' => (int)$hours,
        'minute' => (int)$minutes,
        'second' => (int)$seconds,
    ];

    foreach ($sections as $name => $value){
        if ($value > 0){
            $timeParts[] = $value. ' '.$name.($value == 1 ? '' : 's');
        }
    }

    return implode(', ', $timeParts);
}

Надеюсь, это кому-нибудь поможет.

11 голосов
/ 25 августа 2012

Вот простая 8-строчная PHP-функция, которая преобразует количество секунд в удобочитаемую строку, включая количество месяцев для большого количества секунд:

PHP-функция seconds2human ()

9 голосов
/ 13 октября 2014
gmdate("d H:i:s",1640467);

Результат будет 19 23:41:07. Когда он на одну секунду больше обычного дня, он увеличивает дневное значение на 1 день. Вот почему он показывает 19. Вы можете взорвать результат для ваших нужд и исправить это.

7 голосов
/ 10 мая 2018

Здесь есть несколько очень хороших ответов, но ни один из них не покрыл мои потребности. Я добавил ответ Glavic , чтобы добавить некоторые дополнительные функции, которые мне были нужны;

  • Не печатать нули. Так что «5 минут» вместо «0 часов 5 минут»
  • Правильно обрабатывать множественное число, а не использовать значение по умолчанию во множественном числе.
  • Ограничить вывод заданным количеством единиц; Так что «2 месяца, 2 дня» вместо «2 месяца, 2 дня, 1 час, 45 минут»

Вы можете увидеть работающую версию кода здесь .

function secondsToHumanReadable(int $seconds, int $requiredParts = null)
{
    $from     = new \DateTime('@0');
    $to       = new \DateTime("@$seconds");
    $interval = $from->diff($to);
    $str      = '';

    $parts = [
        'y' => 'year',
        'm' => 'month',
        'd' => 'day',
        'h' => 'hour',
        'i' => 'minute',
        's' => 'second',
    ];

    $includedParts = 0;

    foreach ($parts as $key => $text) {
        if ($requiredParts && $includedParts >= $requiredParts) {
            break;
        }

        $currentPart = $interval->{$key};

        if (empty($currentPart)) {
            continue;
        }

        if (!empty($str)) {
            $str .= ', ';
        }

        $str .= sprintf('%d %s', $currentPart, $text);

        if ($currentPart > 1) {
            // handle plural
            $str .= 's';
        }

        $includedParts++;
    }

    return $str;
}
6 голосов
/ 12 декабря 2016

Простейшим подходом было бы создание метода, который возвращает DateInterval из DateTime :: diff относительного времени в $ секундах от текущего времени $ now, которое затем можно связать и отформатировать. Например: -

public function toDateInterval($seconds) {
    return date_create('@' . (($now = time()) + $seconds))->diff(date_create('@' . $now));
}

Теперь цепочка вашего вызова метода DateInterval :: format

echo $this->toDateInterval(1640467)->format('%a days %h hours %i minutes'));

Результат:

18 days 23 hours 41 minutes
5 голосов
/ 20 июня 2017

Коротко, просто, надежно:

function secondsToDHMS($seconds) {
    $s = (int)$seconds;
    return sprintf('%d:%02d:%02d:%02d', $s/86400, $s/3600%24, $s/60%60, $s%60);
}
3 голосов
/ 29 ноября 2013

Хотя это довольно старый вопрос - можно найти эти полезные (не написано, чтобы быть быстрым):

function d_h_m_s__string1($seconds)
{
    $ret = '';
    $divs = array(86400, 3600, 60, 1);

    for ($d = 0; $d < 4; $d++)
    {
        $q = (int)($seconds / $divs[$d]);
        $r = $seconds % $divs[$d];
        $ret .= sprintf("%d%s", $q, substr('dhms', $d, 1));
        $seconds = $r;
    }

    return $ret;
}

function d_h_m_s__string2($seconds)
{
    if ($seconds == 0) return '0s';

    $can_print = false; // to skip 0d, 0d0m ....
    $ret = '';
    $divs = array(86400, 3600, 60, 1);

    for ($d = 0; $d < 4; $d++)
    {
        $q = (int)($seconds / $divs[$d]);
        $r = $seconds % $divs[$d];
        if ($q != 0) $can_print = true;
        if ($can_print) $ret .= sprintf("%d%s", $q, substr('dhms', $d, 1));
        $seconds = $r;
    }

    return $ret;
}

function d_h_m_s__array($seconds)
{
    $ret = array();

    $divs = array(86400, 3600, 60, 1);

    for ($d = 0; $d < 4; $d++)
    {
        $q = $seconds / $divs[$d];
        $r = $seconds % $divs[$d];
        $ret[substr('dhms', $d, 1)] = $q;

        $seconds = $r;
    }

    return $ret;
}

echo d_h_m_s__string1(0*86400+21*3600+57*60+13) . "\n";
echo d_h_m_s__string2(0*86400+21*3600+57*60+13) . "\n";

$ret = d_h_m_s__array(9*86400+21*3600+57*60+13);
printf("%dd%dh%dm%ds\n", $ret['d'], $ret['h'], $ret['m'], $ret['s']);

результат:

0d21h57m13s
21h57m13s
9d21h57m13s
3 голосов
/ 12 апреля 2016
function seconds_to_time($seconds){
     // extract hours
    $hours = floor($seconds / (60 * 60));

    // extract minutes
    $divisor_for_minutes = $seconds % (60 * 60);
    $minutes = floor($divisor_for_minutes / 60);

    // extract the remaining seconds
    $divisor_for_seconds = $divisor_for_minutes % 60;
    $seconds = ceil($divisor_for_seconds);

    //create string HH:MM:SS
    $ret = $hours.":".$minutes.":".$seconds;
    return($ret);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...