我有一个PHP程序可以识别用户登录时的转换时间。请参阅下面的实际脚本条件。
$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:10访问该页面,这意味着应该在第二班次,而是.. 它属于第一班
我不知道在这个控制流程中我错过了什么..所以如果有来自这里的人可以帮助和分享非常感激的想法。谢谢!
答案 0 :(得分:1)
使用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
}