【问题标题】:Checking a given time between two time in php and return the number of hours在php中检查两个时间之间的给定时间并返回小时数
【发布时间】:2019-09-16 13:53:40
【问题描述】:

我想获取员工从晚上 10 点上班到早上 6 点上班的小时数。我已经搜索了一个代码来检查时间是否在两个时间之间:PHP Check if time is between two times regardless of date

我想查看员工的上班时间是否在晚上 10 点到早上 6 点之间,并返回晚上 10 点到下午 6 点之间的小时数。从链接中,我试过了,我返回了一个错误:Call to a member function modify() on boolean

这是我尝试过的代码,我想使用date_diff 函数来获取从晚上 10 点到早上 6 点的小时数。 $schedule->time_in 是我的员工的时间,在我的代码示例中,我的值是上午 4:00 从$schedule->time_in

这是我使用的链接中的函数并返回错误:

private function isBetween($from, $till, $input) {
        $f = DateTime::createFromFormat('!H:i', $from);
        $t = DateTime::createFromFormat('!H:i', $till);
        $i = DateTime::createFromFormat('!H:i', $input);
        if ($f > $t) $t->modify('+1 day');
        return ($f <= $i && $i <= $t) || ($f <= $i->modify('+1 day') && $i <= $t);
}

我正在尝试像这样使用它来检查它会返回什么值:

$cola_in = "22:00";
$cola_out = "6:00";
print_r($this->isBetween($cola_in,$cola_out,$schedule->time_in));

我不想想出这样的东西:

$cola_in = "22:00";
$cola_out = "6:00";
$date1 = date("H:i",strtotime($schedule->time_in));                 
$date2 = date("H:i",strtotime($cola_in));                   
$date3 = date("H:i",strtotime($cola_out));
    if ($date1 > $date2 && $date1 < $date3) {
        $number_of_hours = $date1->diff($date3);
        print_r($number_of_hours);
    }       

【问题讨论】:

  • 如果我理解正确的话;如果有人在凌晨 4 点打卡,在早上 8 点打卡。那么你想让你的函数返回 2 吗?因为那是他们在晚上 10 点到早上 6 点之间的工作时间?
  • @DirkScholten 是的.. 就是这样
  • @DirkScholten 如果我晚上 10 点和早上 6 点出去,那么函数也应该返回 8。

标签: php datetime time


【解决方案1】:

如果($schedule-&gt;time_in == "4:00am")DateTime::createFromFormat('!H:i', $schedule-&gt;time_in); 将失败并返回FALSE

这解释了错误Call to a member function modify() on boolean 可能是由您的函数中的调用$i-&gt;modify('+1 day') 触发的。

另一方面,如果($schedule-&gt;time_in == "4:00") 错误应该消失。

我希望这会有所帮助。

【讨论】:

  • 我尝试 print_r($schedule->time_in) 输出如下:04:00:00
  • 你能解释一下为什么返回“1”整数值吗?
  • 如何将 04:00:00 转换为 "4:00" .. 顺便说一句,“4:00”是字符串值吗?
  • 您可以使用函数var_dump() 来确保数据类型,但是是的,它是一个字符串。如果您确定$schedule-&gt;time_in 的值,您可以使用DateTime::createFromFormat('!H:i:s', "04:00:00") 或者您可以使用函数substr() 截断字符串。
  • @Melvin 我试过了,但我不明白函数的返回类型。你能向我解释一下上述函数的返回吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多