我有以下代码:
$now = date('2018-12-28 23:00:00');
$begintime = new DateTime('22:00');
$endtime = new DateTime('03:00');
if($now >= $endtime && $now <= $begintime){
// not between times
echo "Run";
} else {
// between times
echo "Skip";
}
回声是
Skip
因为$now
比$begintime
大,使得输出为false
知道时间是否不在$begintime
和$endtime
之间的正确方法是什么?
我搜索了所有相关问题,由于这个问题,我浪费了我三天的时间,但找不到任何东西可以甚至从这个论坛和Google身上找到任何信息。请帮助我,这个问题离我的生活已经荒唐了几天,对我以前的英语感到抱歉。.:D
答案 0 :(得分:1)
您的代码显示出对工作方式的大量误解,并导致了问题。请查看官方文档,您将看到date()返回字符串,而DateTime是一个对象。无法直接比较它们,您需要事先将它们转换为可比较的类型。还要注意,DateTime希望获得一个日期,而不仅仅是时间。实际上没有定义日期,您的$endtime
实际上比$starttime
小:
$begintime = new DateTime('22:00');
$endtime = new DateTime('03:00');
echo $begintime < $endtime ? 'Yes':'No';
此代码段将返回No
。
您需要将$now
转换为DateTime
,并且需要在开始/结束时间标记中添加日期。例如:
$now = \DateTime::createFromFormat('Y-m-d H:i:s', '2018-12-28 23:00:00', new \DateTimeZone('UTC'));
我无法提供转换开始/结束时间标记的示例,因为您尚未定义它们实际需要的外观。
答案 1 :(得分:0)
一种解决方案可能是:
$now = "23:00"; // date ('H:i');
$begintime = "22:00";
$endtime = "03:00";
$now_t = DateTime::createFromFormat('H:i', $now);
$begintime_t = DateTime::createFromFormat('H:i', $begintime);
$endtime_t = DateTime::createFromFormat('H:i', $endtime);
if ($now_t > $begintime_t || $now_t < $endtime_t)
{
echo "Skip";
}
else
{
echo "Run";
}
答案 2 :(得分:0)
最后,我解决了我的问题..
有人可以从我的问题中删除重复的标签并找到此问题的正确标题吗?也许像我一样有同样问题的人可以搜索我的问题并找到答案。
对不起,我的英语,我还在学习。.
// this is variable from mysql database
$mysql_start = "2018-12-28 21:45:00"; // its from mysql DATETIME and time show when this script will be run
$begintime = "22:00"; // user can choose when this script stop
$endtime = "20:00"; // user can choose when this script run
$mysql_start = explode(' ', $mysql_start);
$taskdays = $mysql_start[0]; // 2018-12-28
echo $taskhours = $mysql_start[1]; // 21:45:00
echo "<br>";
$taskhours = explode(':',$taskhours);
$taskhours = $taskhours[0]; // 22
echo $begintime = date($begintime);
echo "<br>";
$begintime = explode(':',$begintime);
$begintime = $begintime[0]; // 20
echo "<br>";
echo $endtime = date($endtime);
echo "<br>";
$endtime = explode(':',$endtime);
$endtime = $endtime[0] - 1; // because if endtime is 6, so if its 05:59, the endtime will be end on 05
echo $endtime = str_pad($endtime, 2, '0', STR_PAD_LEFT); // if 6, it will add 0 so it will be 06
echo "<br>";
$jamarray = array("00","01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23");
$ray = array();
if ($begintime > $endtime){
echo '$begintime is bigger than $endtime<br>';
foreach($jamarray as $ray) {
if($ray >= $begintime or $ray <= $endtime){
//echo '<br>';
//print_r($ray);
$eray[] = $ray;
}
}
$aslinya = array_diff($jamarray,$eray);
print_r($aslinya);
if (in_array($taskhours, $aslinya))
{
echo " <= script run in this time";
}
}else{
echo '$begintime is less than $endtime<br>';
foreach($jamarray as $ray) {
if($ray >= $begintime and $ray <= $endtime){
//echo '<br>';
//print_r($ray);
$eray[] = $ray;
}
}
$aslinya = array_diff($jamarray,$eray);
print_r($aslinya);
if (in_array($taskhours, $aslinya))
{
echo " <= script run in this time";
}
}