【问题标题】:seconds to minutes and days to weeks几秒到几分钟,几天到几周
【发布时间】:2011-02-23 07:32:40
【问题描述】:

我的问题是,我们如何使用 PHP 拥有一个自动化系统,它可以做到这一点: 如果我们有 $seconds= 120; 并且脚本应该得到这个值,看到这等于 2 分钟,然后以 分钟 打印这个值。就像我们想要几天一样,假设$days = 7; 脚本需要获取这个值,检查天数,在这种情况下它需要打印 1 周。谢谢各位!

【问题讨论】:

    标签: php time


    【解决方案1】:
    <?php
    
        /**
         * @param int $secs
         *
         * @return string
         */
        function formatSeconds($secs) {
            $secs = (int)$secs;
            if ( $secs === 0 ) {
                return '0 secs';
            }
            // variables for holding values
            $mins  = 0;
            $hours = 0;
            $days  = 0;
            $weeks = 0;
            // calculations
            if ( $secs >= 60 ) {
                $mins = (int)($secs / 60);
                $secs = $secs % 60;
            }
            if ( $mins >= 60 ) {
                $hours = (int)($mins / 60);
                $mins = $mins % 60;
            }
            if ( $hours >= 24 ) {
                $days = (int)($hours / 24);
                $hours = $hours % 60;
            }
            if ( $days >= 7 ) {
                $weeks = (int)($days / 7);
                $days = $days % 7;
            }
            // format result
            $result = '';
            if ( $weeks ) {
                $result .= "{$weeks} week(s) ";
            }
            if ( $days ) {
                $result .= "{$days} day(s) ";
            }
            if ( $hours ) {
                $result .= "{$hours} hour(s) ";
            }
            if ( $mins ) {
                $result .= "{$mins} min(s) ";
            }
            if ( $secs ) {
                $result .= "{$secs} sec(s) ";
            }
            $result = rtrim($result);
            return $result;
        }
    
        echo formatSeconds(0), "\n";
        echo formatSeconds(30), "\n";
        echo formatSeconds(300), "\n";
        echo formatSeconds(3000), "\n";
        echo formatSeconds(30000), "\n";
        echo formatSeconds(300000), "\n";
        echo formatSeconds(3000000), "\n";
        echo formatSeconds(30000000), "\n";
    

    输出:

    0 secs
    30 sec(s)
    5 min(s)
    50 min(s)
    8 hour(s) 20 min(s)
    3 day(s) 23 hour(s) 20 min(s)
    4 week(s) 6 day(s) 53 hour(s) 20 min(s)
    49 week(s) 4 day(s) 53 hour(s) 20 min(s)
    

    【讨论】:

    • 0 secs 英文不太好 ;)
    • @Shikiryu,如果我用拉脱维亚语写答案会更好吗?
    • @binaryLV :不,但因为你用英语回答...... ;) 0 秒意味着......没有秒,因此它不需要 s 秒。否则,我赞成你的回答,因为它很好。
    • @Shikiryu, en.wikipedia.org/wiki/Plural#Zero - "例如,在英语、德语、荷兰语、意大利语、西班牙语和葡萄牙语中,复数形式用于零或多个,而单数形式用于一件事只要。”所以它是“0 秒”,而不是“0 秒”。
    • 为你提交了一个错字修复。 Hours 在计算 mod 60 时应该是 mod 24。(这会导致上面的输出中出现 53 hour (s)
    【解决方案2】:

    4 周 6 天 53 小时 20 分钟

    53 小时? 另外,300000 秒是 3 天 11 小时,而不是 3 天 23 小时

    function formatSeconds($secs) {
    
        if (!$secs = (int)$secs)
            return '0 seconds';
    
        $units = array(
            'week' => 604800,
            'day' => 86400,
            'hour' => 3600,
            'minute' => 60,
            'second' => 1
        );
    
        $strs = array();
    
        foreach($units as $name=>$int){
            if($secs < $int)
                continue;
            $num = (int) ($secs / $int);
            $secs = $secs % $int;
            $strs[] = "$num $name".(($num == 1) ? '' : 's');
        }
    
        return implode(', ', $strs);
    }
    
    var_dump(formatSeconds(0));
    var_dump(formatSeconds(30));
    var_dump(formatSeconds(300));
    var_dump(formatSeconds(3000));
    var_dump(formatSeconds(30000));
    var_dump(formatSeconds(300000));
    var_dump(formatSeconds(3000000));
    var_dump(formatSeconds(30000000));
    
    
    string(9) "0 seconds"
    string(10) "30 seconds"
    string(9) "5 minutes"
    string(10) "50 minutes"
    string(19) "8 hours, 20 minutes"
    string(28) "3 days, 11 hours, 20 minutes"
    string(37) "4 weeks, 6 days, 17 hours, 20 minutes"
    string(37) "49 weeks, 4 days, 5 hours, 20 minutes"
    

    【讨论】:

      【解决方案3】:

      你可以使用如下简单的东西:

      $seconds = 120;
      $minutes = floor($seconds/60);
      echo $minutes.' min';
      

      我不确定我是否正确理解了您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-26
        • 1970-01-01
        • 2019-08-03
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多