如果当前时间介于两个其他时间之间,我需要确定一下。例如,要检查时间是否在07:00到10:00之间,我可以使用:
$currentTime = new DateTime('09:00');
$startTime = new DateTime('07:00');
$endTime = new DateTime('10:00');
if ($currentTime->format('H:i') >= $startTime->format('H:i') && $currentTime->format('H:i') <= $endTime->format('H:i')) {
// Do something
}
我遇到的问题是如果时间是01:00会发生什么,我想检查它是否在22:00到07:00之间。我并不担心这是另一天,只要它在24小时制的两个小时之间。示例01:00在22:00到07:00之间
22:00,23:00,00:00, 01:00 ,02:00~07:00
我最终想要实现的是,可以在不同时间之间为服务设置不同的价格。因此,我现在循环每小时计算出小时所涉及的价格范围并相应地改变价格。如果有人有更优雅的解决方案,我将不胜感激。
更新
假设我有一条规则说在晚上10点到早上7点之间我要收取双倍费用。我从开始时间到结束时间循环每小时,检查每小时是否在22:00(晚上10点)和07:00(早上7点)之间,如果是,则应收取双倍费用。我想避免考虑约会日期。
答案 0 :(得分:4)
无需使用DateTime::format()
进行比较。 DateTime
个对象已经具有可比性。
要处理跨越午夜的时间段,您需要更改日期,以便准确反映实际日期。
$currentTime = (new DateTime('01:00'))->modify('+1 day');
$startTime = new DateTime('22:00');
$endTime = (new DateTime('07:00'))->modify('+1 day');
if ($currentTime >= $startTime && $currentTime <= $endTime) {
// Do something
}
答案 1 :(得分:4)
<?php
$currentTime = strtotime('1:00');
$startTime = strtotime('22:00');
$endTime = strtotime('7:00');
if (
(
$startTime < $endTime &&
$currentTime >= $startTime &&
$currentTime <= $endTime
) ||
(
$startTime > $endTime && (
$currentTime >= $startTime ||
$currentTime <= $endTime
)
)
) {
echo 'open';
} else {
echo 'clse';
}
答案 2 :(得分:1)
从第一个更流行的解决方案开始,我发现了另一种方法,该方法对我不起作用。
我必须在10:00 pm和06:00 am之间写点东西,并且比较不起作用,因为当我经过午夜时,endTime总是>开始时间。
所以,如果我不介意以这种方式解决的那一天:
$currentTime = new DateTime();
$startTime = new DateTime('22:00');
$endTime = (new DateTime('06:00'))->modify('+1 day');
if ($currentTime->format("a") == "am") {
// echo "It's a new day <br />";
$currentTime = $currentTime->modify('+1 day');
}
if ($currentTime >= $startTime && $currentTime <= $endTime) {
echo "hello";
}
答案 3 :(得分:0)
//get current DateTime
$date = new DateTime('now');
$currentHour = 0;
$currentMinutes = 0;
foreach ($date as $item=>$value ) {
if($item=="date"){
$p = explode(" ",$value)[1];
$hour = explode(":",$p);
$currentHour = $hour[0];
$currentMinutes = $hour[1];
}
}
$returnVO["success"] = ((int)$currentHour<12 || ((int)$currentHour>=22 && (int)$currentMinutes > 0) ) ? false : true;