【问题标题】:How to convert a decimal into time, eg. HH:MM:SS如何将小数转换为时间,例如。 HH:MM:SS
【发布时间】:2016-12-14 17:02:21
【问题描述】:

我正在尝试使用小数并将其转换为小时、分钟和秒。

我有小时和分钟,但我想找出秒。谷歌搜索了一段时间没有运气。我敢肯定这很简单,但我尝试过的任何方法都没有奏效。任何建议表示赞赏!

这是我所拥有的:

function convertTime($dec)
{
    $hour = floor($dec);
    $min = round(60*($dec - $hour));
}

就像我说的,我可以毫无问题地得到小时和分钟。出于某种原因,只是努力争取秒数。

谢谢!

【问题讨论】:

  • 那个“十进制”是什么格式的?
  • 您所拥有的似乎也不正确。你能提供一个示例输入和预期输出吗?
  • 小数点没什么特别的。类似 5.67891234。
  • 另外,输出应该只是一个小时数、一个分钟数和一个秒数,然后我可以使用它们来打印 HTML 页面。

标签: php


【解决方案1】:

如果$dec 以小时为单位($dec,因为提问者特别提到了 decimal):

function convertTime($dec)
{
    // start by converting to seconds
    $seconds = ($dec * 3600);
    // we're given hours, so let's get those the easy way
    $hours = floor($dec);
    // since we've "calculated" hours, let's remove them from the seconds variable
    $seconds -= $hours * 3600;
    // calculate minutes left
    $minutes = floor($seconds / 60);
    // remove those from seconds as well
    $seconds -= $minutes * 60;
    // return the time formatted HH:MM:SS
    return lz($hours).":".lz($minutes).":".lz($seconds);
}

// lz = leading zero
function lz($num)
{
    return (strlen($num) < 2) ? "0{$num}" : $num;
}

【讨论】:

  • 感谢您的帮助。这比我试图做的更有意义。 :)
  • 不用创建lz函数,你可以使用原生的str_pad函数,来自PHP:str_pad($num, 2, 0, STR_PAD_LEFT)
  • @elboletaire 非常真实,我只是碰巧从我的一些旧班级中撕掉了这个。
  • 请注意:我不同意在convertTime() 函数的第一行添加显式(int) 演员表的社区编辑。编辑说明中提到了将 $dec 转换为 (int) 以进行舍入 - 如果您想舍入秒数,只需在适当的位置使用 round()
  • 事实上,由于提问者专门询问了 decimal,我删除了 (int) 演员表。截断小时变量并仍然进行分钟和秒计算没有多大意义(因为如果你对小时变量进行四舍五入,就不会有任何分钟或秒!)
【解决方案2】:

一行非常简单的解决方案:

echo gmdate('H:i:s', floor(5.67891234 * 3600));

【讨论】:

  • @Crontab 没想到 :) 谢谢。
  • date()代替gmdate()有关系吗?
  • @Staysee 十进制时间,我认为,作为时间戳,在 UTC 时区中定义。否则它将被转移到服务器的时区,你可能永远不会得到,例如,0 等等。
  • @sabertababaeyazdi 喜欢这样,例如$time = strtotime('17:30') - strtotime('midnight'); echo $time / 3600;
  • 警告:如果您的十进制数大于一天(例如秒表)并且想要小时:分钟,这将循环循环,因为它永远不会超过 24。
【解决方案3】:

在我的情况下,所有赞成的东西都不起作用。 我已经使用该解决方案将十进制小时和分钟转换为正常时间格式。 即

function clockalize($in){

    $h = intval($in);
    $m = round((((($in - $h) / 100.0) * 60.0) * 100), 0);
    if ($m == 60)
    {
        $h++;
        $m = 0;
    }
    $retval = sprintf("%02d:%02d", $h, $m);
    return $retval;
}


clockalize("17.5"); // 17:30

【讨论】:

  • 倒数 17:30 -> 17.5
【解决方案4】:

我不确定这是否是最好的方法,但是

$variabletocutcomputation = 60 * ($dec - $hour);
$min = round($variabletocutcomputation);
$sec = round((60*($variabletocutcomputation - $min)));

【讨论】:

    【解决方案5】:

    这是一种很好的方法,可以避免浮点精度问题:

    function convertTime($h) {
        return [floor($h), (floor($h * 60) % 60), floor($h * 3600) % 60];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多