代码之家  ›  专栏  ›  技术社区  ›  Alena

PHP:错误的时间计算

  •  -2
  • Alena  · 技术社区  · 6 年前

    • 从db中提取值
    • 把它转换成时间 strtotime
    • date 功能

    $time_1     = '1:00';
    $time_2 = '0:05';
    
    //should be 1:05, whereas it prints 04:05
    echo date("H:i", strtotime($time_1) + strtotime($time_2));
    

    请告诉我,上面的代码有什么问题,如何修复?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Nick    6 年前

    你的问题是因为 strtotime 返回自Unix纪元(1970年1月1日)以来的秒数。所以你得到的不是价值观 60 5 ,但更像是 1537570800 1537567500 . 当你把这两个值加在一起,你就得到了一个遥远的未来,一个看起来像是随机时间的日期。为了补偿这一点,需要减去 strotime公司 在一天开始时,将第二个时间设为相对时间,例如:

    echo date("H:i", strtotime($time_1) + strtotime($time_2) - strtotime('00:00'));
    

    输出:

    01:05
    

    更新

    可以 超过24小时,以上代码将不起作用(显示的最长时间为 23:59 00:00

    $time_1 = '12:00';
    $time_2 = '14:30';
    $time_sum = (strtotime($time_1) + strtotime($time_2) - 2 * strtotime('00:00')) / 60;
    printf('%02d:%02d', intdiv($time_sum, 60), $time_sum % 60);
    

    26:30
    
        2
  •  1
  •   Madhur Bhaiya    6 年前

    使用 DateTime::createFromFormat 功能,并从 Adding two DateTime objects in php

    $time_1 = '1:00';
    $time_2 = '0:05';
    $t1 = DateTime::createFromFormat('G:i', $time_1);
    $t2 = DateTime::createFromFormat('G:i', $time_2);
    
    $interval1 = $t1->diff(new DateTime('00:00:00')) ;
    $interval2 = $t2->diff(new DateTime('00:00:00')) ;
    
    $e = new DateTime('00:00');
    $f = clone $e;
    $e->add($interval1);
    $e->add($interval2);
    $total = $f->diff($e)->format("%H:%I:%S");
    

    其他详细信息:

    • G和H 带或不带前导零的小时的24小时格式