【问题标题】:Add fractional hours to a DateTime in php在 php 中将小数小时添加到 DateTime
【发布时间】:2017-10-26 11:32:24
【问题描述】:

我有一个系统,我需要添加一定数量的小数小时。 我一直在寻找,这就是我得到的,到目前为止它是最准确的方法,但仍然没有给我需要的答案

    function calculateHours($hours){

    $now =  new DateTime("2017-10-25 10:23:00");  
    $time = array();
    $time = explode(".", $hours);
    $time [1] += $time [0]*60;

    $now->modify("+".$time[1]." hours");

    return $now; 
}


$diff = 119.23;
$answer = calculateHours($diff);
echo $answer ->format('Y-m-d H:i:s');

我想要达到的答案是“2017-11-09 11:00:00”,而我收到的是“2017-10-25 12:22:23”

【问题讨论】:

  • 您的问题似乎有几个问题。当我运行你的代码时,我得到了结果2017-10-25 12:22:23。因此,要么开始日期不正确,要么您要添加的小时数不正确。此外,当将 119 乘以 60 时,这将计算 分钟,但您添加的是 (因此将小时乘以 3600,将分钟乘以 60)。
  • 刚刚编辑过,我现在才意识到它给出的是“2017-10-25”而不是“2017-11-09”,并且我要添加的小时数是正确的(据我所知)。
  • $diff = 119.23是什么时间单位?
  • 小时,刚刚在代码上编辑了它:)
  • @MathewSGon 仍然没有加起来。当您将 119.23 小时添加到 2017-10-25 时,它只会增加大约 5 天。所以你永远不会到达2017-11-09

标签: php datetime timestamp strtotime


【解决方案1】:

添加时间不正确。小时乘以 60 就是分钟。

这段代码应该可以工作。

function calculateHours($hours){

    $now =  new DateTime("2017-10-25 10:23:00");
    $time = explode(".", $hours);
    $time[1] += $time[0]*60;

    $now->modify("+".$time[1]." minutes");

    return $now;
}


$diff = 119.23;
$answer = calculateHours($diff);
echo $answer->format('Y-m-d H:i:s');

结果是2017-10-30 09:46:00

【讨论】:

  • 是的,我得到了这个结果,仍然在想我的代码没有达到指定值是什么问题
  • 我把$now->modify("+".$time[1]." hours");改成了$now->modify("+".$time[1]." minutes");
【解决方案2】:

使用date_add

date_add($now, date_interval_create_from_date_string($tempo[1]' hours'));

或作为对象:

 $now->add( DateInterval::createFromDateString($tempo[1].' hours'));

【讨论】:

  • 投反对票,因为他的示例使用 Object 而不是过程类型
  • 仅链接回答
  • @Mcsky 同样在这里
【解决方案3】:

您应该使用 DateInterval php class 从您的 $hours 变量中创建一个 x 秒的反函数。

那么你只需要使用datetime add interval方法来修改你的日期

请看一下这个例子

function calculateHours($hours){

    $now       =  new DateTime("2017-10-25 10:23:00");  
    var_dump($now);
    $timeParts = explode(".", $hours);
    // Where 23 is a percentage of on hour
    $minutes   = $timeParts[0] * 60 + round($time[1] * 60 / 100);
    // Where 23 is the number of minutes
    $minutes   = $timeParts[0] * 60 + $time[1];

    $interval = new DateInterval(sprintf('PT%dM', $minutes));
    $now->add($interval);
    echo $now->format('Y-m-d H:i:s');

    return $now; 
}

【讨论】:

  • 我没有投反对票,但您可能因为发布手册而遭到反对。虽然里面的信息可能会提供答案,但对于stackoverflow来说并不是一个合适的答案。请添加一个适用于 OP 情况的示例,您可能会看到投票发生变化。
猜你喜欢
  • 1970-01-01
  • 2016-10-22
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2013-05-23
相关资源
最近更新 更多