【问题标题】:php - seconds to time left?php - 还剩几秒?
【发布时间】:2010-12-11 05:17:39
【问题描述】:

我正在尝试格式化一个日期,以说明还剩多少秒(以可读格式):

<?php
    $seconds = 23414;
    $date = new DateTime();
    $date->setTime(0, 0, $seconds);
    echo $date->format('z G:i:s');
?>

这个例子可能会输出类似:344 11:46:45 这不是我想要的。它应该说类似6 days, 4:12:36。我只是在这里看不到任何东西:http://www.php.net/manual/en/function.date.php 这将帮助我正确格式化它。想法?

【问题讨论】:

    标签: php datetime format


    【解决方案1】:

    我不知道有什么内置的,但是写起来很容易:

    function formatSeconds($secondsLeft) {
    
      $minuteInSeconds = 60;
      $hourInSeconds = $minuteInSeconds * 60;
      $dayInSeconds = $hourInSeconds * 24;
    
      $days = floor($secondsLeft / $dayInSeconds);
      $secondsLeft = $secondsLeft % $dayInSeconds;
    
      $hours = floor($secondsLeft / $hourInSeconds);
      $secondsLeft = $secondsLeft % $hourInSeconds;
    
      $minutes= floor($secondsLeft / $minuteInSeconds);
    
      $seconds = $secondsLeft % $minuteInSeconds;
    
      $timeComponents = array();
    
      if ($days > 0) {
        $timeComponents[] = $days . " day" . ($days > 1 ? "s" : "");
      }
    
      if ($hours > 0) {
        $timeComponents[] = $hours . " hour" . ($hours > 1 ? "s" : "");
      }
    
      if ($minutes > 0) {
        $timeComponents[] = $minutes . " minute" . ($minutes > 1 ? "s" : "");
      }
    
      if ($seconds > 0) {
        $timeComponents[] = $seconds . " second" . ($seconds > 1 ? "s" : "");
      }
    
      if (count($timeComponents) > 0) {
        $formattedTimeRemaining = implode(", ", $timeComponents);
        $formattedTimeRemaining = trim($formattedTimeRemaining);
      } else {
        $formattedTimeRemaining = "No time remaining.";
      }
    
      return $formattedTimeRemaining;
    
    }
    

    我还没有彻底测试它,但是我运行的测试运行良好。在使用它之前,您可能需要自己测试一下。

    【讨论】:

    • 谢谢。你比我的格式更精确一点。我选择了简单的路线,但您花时间创建了一个 HH:MM:SS 格式,就像 OP 提到的那样。
    【解决方案2】:

    类似:

    $SECONDS_IN_MINUTE = 60;
    $SECONDS_IN_HOUR = $SECONDS_IN_MINUTE * 60;
    $SECONDS_IN_DAY = $SECONDS_IN_HOUR * 24;
    
    $days = 0;
    $hours = 0;
    $minutes = 0;
    $seconds = 23414;
    
    while ($seconds > $SECONDS_IN_DAY) {
       $days++;
       $seconds -= $SECONDS_IN_DAY;
    }
    while ($seconds > $SECONDS_IN_HOUR) {
       $hours++;
       $seconds -= $SECONDS_IN_HOUR;
    }
    while ($seconds > $SECONDS_IN_MINUTE) {
       $minutes++;
       $seconds -= $SECONDS_IN_MINUTE;
    }
    
    echo ($days > 0 ? $days . ' day' . ($days > 1 ? 's' : '') . ', ' : '') . 
         $hours . ':' . str_pad($minutes, 2, '0',  STR_PAD_LEFT) . ':' . str_pad($seconds, 2, '0',  STR_PAD_LEFT);
    

    很脏,但应该可以工作。

    【讨论】:

    • 顺便说一句:23414 秒 = '6:30:14',而不是 '6 天,4:12:36'
    • 最后的回声有点问题。将小时、分钟和秒格式化为 10 以下时需要添加前导零,否则会得到类似“12:4:32”的输出。
    猜你喜欢
    • 2011-11-20
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多