удобный способ конвертировать секунды в более конкретный формат - PullRequest
1 голос
/ 02 июня 2011

Есть ли удобный способ конвертировать секунды в более конкретный формат.

Например:

Я хочу преобразовать

559 seconds

в

9 min 19 sec

Ответы [ 6 ]

2 голосов
/ 02 июня 2011

gmdate можно использовать

echo gmdate("H:i:s", 559 );
2 голосов
/ 02 июня 2011
$seconds = 559;

$minutes = floor($seconds / 60);  // 9
$seconds = $seconds % 60;         // 19
1 голос
/ 03 июня 2011

Единственным недостатком использования gmdate("H:i:s",$foo) является то, что он работает только для $foo в диапазоне от 0 до 86399 и дает вам начальные нули там, где вы можете или не захотите их.Вот решение, которое я использовал, которое использует gmdate() только когда наш временной интервал большой:

function formatTimeSpan($span) { 
  if ($span < (60)) { //--- less than a minute
    $r = $span." sec";  # just use the seconds as they are
  }
  elseif ($span < (60*60)) { //--- a minute to under an hour
    $min = intval($span/60);
    $sec = $span - ($min*60);
    $r = $min." min, ".$sec." sec";
  }
  elseif ($span < (24*60*60)) { //--- an hour to under a day
    $r = gmdate("G:i:s",$span);
  }
  else { //--- a day or more
    $days = intval($span/(24*60*60));
    $remSec = $span - ($days * (24*60*60));
    $r = $days." d, ".gmdate("G:i:s",$remSec); 
  }

  return $r;
}

Использование / вывод выглядит следующим образом:

echo formatTimeSpan(3);      // 3 sec
echo formatTimeSpan(59);     // 59 sec
echo formatTimeSpan(60);     // 1 min, 0 sec
echo formatTimeSpan(559);    // 9 min, 19 sec
echo formatTimeSpan(3667);   // 1:01:07
echo formatTimeSpan(85483);  // 23:44:43
echo formatTimeSpan(86901);  // 1 d, 00:08:21

Очевидно, если вы хотите выводбольше похоже на 1 hr, 1 min, 7 sec, вы можете полностью извлечь gmdate() и изменить форматирование / строки в соответствии со своими вкусами / потребностями.

Небольшие предостережения, хотя: Это не проверяетпосмотрите, должны ли «единицы» быть единичными или множественными, поэтому я использовал такие сокращения, как «sec», «min», и т. д. Кроме того, он не проверяет наличие 0 каких-либо единиц;вы могли бы скорее 1 min, 0 sec выразить просто как 1 min.

1 голос
/ 02 июня 2011

Ниже приведена PHP-версия, написанная мной для небольшого собственного кода SmallC, поставляемого с AMX Mod X .

<?php
/**
 * PHPInSimMod - Time Module
 * @package PRISM
 * @subpackage Time
 * @copyright the AMX Mod X Development Team & The PRISM Devlopment Team.
*/

class Time
{
    // Time unit types.
    const UNIT_SECONDS      = 0;
    const UNIT_MINUTES      = 1;
    const UNIT_HOURS        = 2;
    const UNIT_DAYS         = 3;
    const UNIT_WEEKS        = 4;

    // The number of seconds that are in each time unit.
    const SECONDS_IN_MINUTE = 60;
    const SECONDS_IN_HOUR   = 3600;
    const SECONDS_IN_DAY    = 86400;
    const SECONDS_IN_WEEK   = 604800;

    /**
     * @desc: By Brad for AMX Mod X.
     * @param: Unit - The number of time units you want translated into verbose text.
     * @param: Type - The type of unit (i.e. seconds, minutes, hours, days, weeks) that you are passing in.
    */
    static function getLength($unit, $type = Time::UNIT_SECONDS)
    {
        # Ensure the varables are of the correct datatype.
        $unit = (int) $unit;
        $type = (int) $type;

        # If our units happens to equal zero, skip.
        if ($unit == 0)
            return '0 seconds';

        # Determine the number of each time unit there are.
        $weeks = 0; $days = 0; $hours = 0; $minutes = 0; $seconds = 0;

        # Handle the various scales of time.
        switch ($type)
        {
            case Time::UNIT_SECONDS: $seconds = $unit;
            case Time::UNIT_MINUTES: $seconds = $unit * Time::SECONDS_IN_MINUTE;
            case Time::UNIT_HOURS:   $seconds = $unit * Time::SECONDS_IN_HOUR;
            case Time::UNIT_DAYS:    $seconds = $unit * Time::SECONDS_IN_DAY;
            case Time::UNIT_WEEKS:   $seconds = $unit * Time::SECONDS_IN_WEEK;
        }

        # How many weeks left?
        $weeks = $seconds / Time::SECONDS_IN_WEEK;
        $seconds -= ($weeks * Time::SECONDS_IN_WEEK);

        # How many days left?
        $days = $seconds / Time::SECONDS_IN_DAY;
        $seconds -= ($days * Time::SECONDS_IN_DAY);

        # How many hours left?
        $hours = $seconds / Time::SECONDS_IN_HOUR;
        $seconds -= ($hours * Time::SECONDS_IN_HOUR);

        # How many minutes left?
        $minutes = $seconds / Time::SECONDS_IN_MINUTE;
        $seconds -= ($minutes * Time::SECONDS_IN_MINUTE);

        # Seconds are the base unit, so it's handled intrinsically

        // Translate the unit counts into verbose text
        $timeElement = array();

        if ($weeks > 0)
            $timeElement[] = sprintf("%i %s", $weeks, ($weeks == 1) ? "week" : "weeks");
        if ($days > 0)
            $timeElement[] = sprintf("%i %s", $days, ($days == 1) ? "day" : "days");
        if ($hours > 0)
            $timeElement[] = sprintf("%i %s", $hours, ($hours == 1) ? "hour" : "hours");
        if ($minutes > 0)
            $timeElement[] = sprintf("%i %s", $minutes, ($minutes == 1) ? "minute" : "minutes");
        if ($seconds > 0)
            $timeElement[] = sprintf("%i %s", $seconds, ($seconds == 1) ? "second" : "seconds");

        // Outputs are final result in the correct format.
        switch(count($timeElement))
        {
            case 1: return sprintf("%s", $timeElement[0]);
            case 2: return sprintf("%s & %s", $timeElement[0], $timeElement[1]);
            case 3: return sprintf("%s, %s & %s", $timeElement[0], $timeElement[1], $timeElement[2]);
            case 4: return sprintf("%s, %s, %s & %s", $timeElement[0], $timeElement[1], $timeElement[2], $timeElement[3]);
            case 5: return sprintf("%s, %s, %s, %s & %s", $timeElement[0], $timeElement[1], $timeElement[2], $timeElement[3], $timeElement[4]);
        }
    }
}

?>
1 голос
/ 02 июня 2011

См. http://dev.kafol.net/2008/09/php-calculating-time-span-duration.html

 $days = floor($seconds/60/60/24);
 $hours = $seconds/60/60%24;
 $mins = $seconds/60%60;
 $secs = $seconds%60;

 $duration='';
 if($days>0) $duration .= "$days days ";
 if($hours>0) $duration .= "$hours hours ";
 if($mins>0) $duration .= "$mins minutes ";
 if($secs>0) $duration .= "$secs seconds ";
0 голосов
/ 02 июня 2011

Вы можете сделать это:

$sec = 559;

$min = floor($sec / 60);
$sec = $sec % 60; // 19
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...