【问题标题】:Php check range between 2 time variablesphp检查2个时间变量之间的范围
【发布时间】:2012-08-26 16:43:48
【问题描述】:

我在检查时间范围时遇到问题。

例子

<?php

$starthour = '08'; //Starting work hour
$finishhour = '23'; //Finishing work hour
$extrapaidhours = 0; //Counting extrapaying hours

if($starthour <= 5) {
    if($starthour==5) { $extrapaidhours += 5; }
    else { $extrapaidhours += 5 - $starthour; }
}

if($starthour > 22) {
    $extrapaidhours += 24 - $starthour;
}


if($finishhour <= 5) {
    if($finishhour==5) { $extrapaidhours += 5; }
    else { $extrapaidhours += 5 - $finishhour; }
}

if($finishhour > 22) {
    $extrapaidhours += 24 - $finishhour;
}

echo $extrapaidhours;

我有点堆叠,我认为我的逻辑做错了。 我正在尝试获取 22-05 之间的时间。

也许有人从 21:00 到 05:00 开始工作,并且他在这个范围内有额外的工作时间,即从 22:00 到 05:00 的 7 个小时。

我该如何处理。谢谢大家。

【问题讨论】:

  • DateInterval class(在 PHP 5.3 及更高版本中)。
  • 有一个关于 DateInterval 的小文档,用谷歌搜索了一些东西,但找不到合适的东西。
  • 其实,DateTime::diff。它给你的是一个DateInterval对象。

标签: php time range


【解决方案1】:

我喜欢玩一些不太流行的 PHP 函数和非标准方法:)

<?php
$start_hour = '19'; //Starting work hour
$finish_hour = '08'; //Finishing work hour
$extra_paid_hours = array(22, 23, 0, 1, 2, 3, 4, 5); //list of extra paid hours

if ($start_hour <= $finish_hour) {
    $hours = range(intval($start_hour), intval($finish_hour));
} else {
    $hours = array_merge(range(intval($start_hour), 23), range(0, intval($finish_hour)));
}

$extra_paid_hours_count = array_reduce($hours, function($accum, $hour) use($extra_paid_hours) {
        $accum += in_array($hour, $extra_paid_hours) ? 1 : 0;
        return $accum;
    }, 0);

echo $extra_paid_hours_count;

【讨论】:

    【解决方案2】:

    这是一个可能的解决方案。

    我们必须考虑两种不同的情况:

    第一:$starthour &lt; $finishhour -&gt; $starthour$finishhour 在同一天 第二:$starthour &gt; $finishhour -&gt; $starthour$finishhour 在两个不同的日子里

    此解决方案仅使用一个 if/else 语句和 max/min 其余函数

    <?php
        $starthour = '08';      //Starting work hour
        $finishhour = '23';     //Finishing work hour
        $extrapaidhours = 0;    //Counting extrapaying hours
    
        if ($starthour < $finishhour) 
            $extrapaidhours += (min($finishhour,5)-min($starthour,5))
                            + (max($finishhour,22)-max($starthour,22));
        else
            $extrapaidhours += (5-min(5,$starthour))
                            + (24-max(22,$starthour))
                            + min(5,$finishhour)
                            +(max($finishhour,22)-22);
        echo $extrapaidhours;
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      相关资源
      最近更新 更多