【问题标题】:How to convert h:m:s to float and float to h:m:s php如何将h:m:s转换为float和float到h:m:s php
【发布时间】:2021-11-28 21:20:05
【问题描述】:

我想将秒的时间值转换为浮点数,而不是对其进行一些计算并使用 php 再次将其转换为时间值

我使用了下面描述的函数,但它只有小时和分钟的计算,如果有第二个值,它会显示错误的数量。

我从time conversion to float找到了这个函数

我使用了将时间转换为浮点数的函数

function hours_tofloat($val){
    if (empty($val)) {
        return 0;
    }
    $parts = explode(':', $val);
    return $parts[0] + floor(($parts[1]/60)*100) / 100;
}

hours_tofloat("00:02:37"); 如果我将上面的函数用于00:02:37 时间值,它会给我错误的浮点数,没有0.03,因为上面的函数没有第二个选项。所以请帮助我并指导如何计算它

【问题讨论】:

  • 为什么要转成float?无论如何,浮点数都不准确(但近似)。
  • 我要计算时间价值。时间价值的加减法效果不好
  • 将它们转换为整数时间戳应该可以正常工作。换句话说,将整个事情转换为秒,然后进行数学运算。
  • 它会在负时间值(如负 04:30:00 小时)中产生问题
  • 所以你有时间成为-04:30:00 吗?只需将最后几秒乘以-1

标签: php time


【解决方案1】:

如下修改您的代码。它将返回seconds 中的时间。

$val = '00:02:37';
function hours_tofloat($val){
    if (empty($val)) {
        return 0;
    }
    $parts = explode(':', $val);
    return (int) (($parts[0] * 60 *60) + $parts[1]*60 + $parts[2]);
}

echo hours_tofloat($val);

输出:00:02:37 = 157

返回

157

【讨论】:

  • 整数会更好 - 请参阅上面的第一条评论
  • 是的,求助者更喜欢将其转换为浮点数。这就是为什么将其转换为浮点数而不是整数的原因。
  • 仅仅因为他们说他们更喜欢它并不意味着它是一个好主意。他们更有可能只是没有意识到这可能会导致不准确。我们的工作也是提供最佳解决方案,而不仅仅是盲目地完全按照所有要求,无论如何
  • @ADyson 感谢您的出色建议。好的,我已经更新了代码,并将在下面的答案中记住它。
  • 没问题。投赞成票。
【解决方案2】:

为什么不使用 EPOCH 时间例程?纪元时间是一个整数,表示基于 1970 年 1 月 1 日的秒数。您不需要日期部分,因此可以采用以下方法:

<?php
  $time = '00:02:37';
  $date = new DateTime("1970-01-01T$time+00:00");
  echo 'Seconds = '.$date->format('U');
?>

输出

Seconds = 157

【讨论】:

    【解决方案3】:
    $val = "00:02:37";
    /* function converts time value to float */
    function time_to_float($val){
     $parts = explode(':', $val);
     $hour_val = 0;
     $hour_val = $parts[0];
     $min_val    = $parts[1]; 
     $second_val = $parts[2]; 
     return ($hour_val +(($min_val* 1/60))+($second_val * 1/3600));
    }
    $value = time_to_float($val);// 0.043611111111111
    
    /* function to convert float to time */
    $res = float_to_time($value);//00:02:37
    
     function float_to_time($value){
        $value1 = explode('.',$value);
        $hours = $value1[0];
        $min_in_float = ($value - $hours) * 60/1;
        $min_val = explode('.',$min_in_float);
        $min_val = $min_val[0];
        $min_in_float = $min_in_float - $min_val;
        $second_val = $min_in_float * 60/1;
        $second_val = round($second_val);
        if($hours < 10){
            $hours = "0".$hours;
        }
        if($min_val < 10){
            $min_val = "0".$min_val;
        }
        if($second_val < 10){
            $second_val = "0".$second_val;
        }
        
        return $hours.":".$min_val.":".$second_val;
     }
    

    我得到了关于计算的参考

    https://www.calculatorsoup.com/calculators/time/time-to-decimal-calculator.php https://www.calculatorsoup.com/calculators/time/decimal-to-time-calculator.php

    【讨论】:

      【解决方案4】:

      使用strtotime 我可以立即获得秒数。必须使用 UTC 作为时区。

      $time = '00:02:37';
      $seconds = strtotime('1970-01-01 '.$time.' UTC'); //157
      

      gmdate可用于将整数转换为时间H:i:s。

      $seconds = 157;
      $timeHis = gmdate('H:i:s',strtotime('1970-01-01 UTC +'.$seconds.' Seconds'));
      //'00:02:37'
      

      小时数不得超过 23,秒数 $seconds 必须小于 86400(= 1 天)。也不支持负时间。

      【讨论】:

        猜你喜欢
        • 2013-12-25
        • 2019-04-16
        • 2014-06-28
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        • 2015-02-25
        • 1970-01-01
        相关资源
        最近更新 更多