条件为特定范围的时间来识别Shift


Condition for specific range of time to identify Shift

我有一个PHP程序,可以识别用户登录时的Shift时间。参见下面的实际脚本条件。

$dt = new DateTime(date('H:i:s'));
$dt->setTimezone( new DateTimeZone("Asia/Manila") );
$timeNow = $dt->format('H:i:s');
if (strtotime($timeNow) >= mktime(07,0,0) && strtotime($timeNow) < mktime(15,0,0)){
    $shift = "2nd [0700H - 1500H]";
}elseif(strtotime($timeNow) >= mktime(15,0,0) && strtotime($timeNow) < mktime(23,0,0)){
    $shift = "3rd [1500H - 2300H]";
}else{
    $shift = "1st [2300H - 0700H]";
}

上面的脚本正在工作,但有记录落入错误的移位…例如,用户在7:10AM访问页面,这意味着应该在第二档,但相反…它属于1st Shift

我不知道我在这个控制流程中错过了什么。因此,如果这里有人可以帮助和分享想法,我将非常感激。谢谢你!

使用DateTime::setTimezone()和在DateTime构造函数中应用时区是有区别的。前者将现有时间转换为DateTimezone作为参数指定的DateTime::setTimezone(),后者假设提供的格式化日期为已经在该时区

你说你想知道现在是马尼拉早上7点到下午3点之间,还是下午3点到晚上11点之间,等等…所以我们的想法是只在那个时区内进行比较。这里不需要做任何时区转换。

$now = new DateTime("now", new DateTimeZone("Asia/Manila"));
$shift2 = new DateTime("7:00 AM", new DateTimeZone("Asia/Manila"));
$shift3 = new DateTime("3:00 PM", new DateTimeZone("Asia/Manila"));
$shift1 = new DateTime("11:00 PM", new DateTimeZone("Asia/Manila"));
if ($now >= $shift2 && $now < $shift3) {
    // It's shift 2
} elseif ($now >= $shift3 && $now < $shift1) {
    // It's shift 3
} else {
    // It's shift 1
}