2010-08-04 72 views
15

我有两次存储在变量$resttimefrom$resttimeto中的格式,分别为7:30:00和22:30:00。如何在PHP中比较两次

我想检查当前时间是否在这两个值之间。我正在用代码检查这个

$time = date("G:i:s"); 
if ($time > $resttimefrom and $time < $resttimeto){ 
    $stat = "open"; 
} else { 
    $stat = "close"; 
} 

但我总是得到$ stat作为关闭。什么可能导致?

+0

由于其简单的逻辑! – Rajasekar 2010-08-04 10:10:37

+0

可能重复的[PHP的比较日期](http://stackoverflow.com/questions/2113940/php-compare-date) – Kuf 2013-01-24 17:00:25

+0

这是因为$ resttimefrom和$ resttimeto没有定义 – Black 2015-11-05 09:57:22

回答

-3

正如上校弹片还说我通过转换到秒,所有的时间,然后做它当前时间的总秒数与比较

+0

你的意思是,这是被接受的答案? – 2017-10-31 09:20:32

3

您正在比较字符串。
使用strtotime()将时间字符串转换为时间戳。
然后与time()比较。

3
$today = date("m-d-y "); 
$now = date("m-d-y G:i:s"); 

if (strtotime($today . $resttimefrom) < $now && $now > strtotime($today . $resttimeto)) { 
    $stat = 'open'; 
else 
    $stat = 'close 
2

date函数返回一个字符串,那么你正在做将是一个字符串比较的比较 - 所以7:30将超过22:30

这将是更好的使用mktime ,它会返回一个Unix时间戳值(整数),所以它将使一个更好的比较

$currentTime = mktime(); 
$resttimefrom = mktime(hour,min,second); 

http://php.net/mktime

+0

正如上面的答案中所述:if时间以字符串形式提供给您,那么使用strtotime会更容易 – 2010-08-04 08:43:39

+0

当不带参数调用时,'mktime()'抛出一个'E_STRICT'通知。此外,当DST是一个因素时,您的代码可能会导致错误的结果。 'mktime'有一个标志来指示DST,但是从PHP5.3开始,如果使用了'is_dst'参数,它也会抛出'E_DEPRECATED'通知。 – Gordon 2010-08-04 08:55:49

4

尝试将它们重新格式化为可以比较的东西。例如,数字:

$resttimefrom = mktime(7,30,0); 
$resttimeto = mktime(22,30,0); 

$time = mktime(date('H'),date('i'),date('s')); 
+0

不考虑夏令时。 – Gordon 2010-08-04 08:56:23

1

只需将您的日期转换为Unix时间戳,比较它们即可获得结果!它可能是这个样子:

$time =date("G:i:s"); 

$time1 = strtotime($time); 
$resttimefrom1 = strtotime($resttimefrom); 
$resttimeto1 = strtotime($resttimeto); 
if ($time1 >$resttimefrom and $time1 <$resttimeto) 
{ 
    $stat="open"; 
} 
else 
{ 
    $stat="close"; 
} 
0
$firstTime = '1:07'; 
$secondTime = '3:01'; 

list($firstMinutes, $firstSeconds) = explode(':', $firstTime); 
list($secondMinutes, $secondSeconds) = explode(':', $secondTime); 

$firstSeconds += ($firstMinutes * 60); 
$secondSeconds += ($secondMinutes * 60); 
$difference = $secondSeconds - $firstSeconds; 
20

一个简单而聪明的方式做,这是去除“:”从你的日期。

$resttimefrom = 73000; 
$resttimeto = 223000; 

$currentTime = (int) date('Gis'); 

if ($currentTime > $resttimefrom && $currentTime < $resttimeto) 
{ 
    $stat="open"; 
} 
else 
{ 
    $stat="close"; 
} 
+0

好主意。我试图在没有'strtotime'的Twig中做到这一点,这很好地工作。 – regularmike 2015-11-09 04:32:16

1

诀窍操纵和在PHP比较日期和时间是存储的日期/时间值的整数变量,并使用mktime(),日期()和的strtotime()函数。日期/时间的整数表示是自1970年1月1日午夜以来的秒数,其被称为“时代”。一旦你的日期/时间是整数形式,你就可以有效地将它与其他也是整数形式的日期进行比较。

当然,因为你很可能会被从页面的请求和数据库接收的日期/时间值中选择你需要的日期/时间字符串转换为整数,你可以做任何比较或算术之前查询。

假设您确定$ resttimefrom和$ resttimeto变量包含格式正确的时间,您可以使用strtotime()函数将字符串时间转换为整数。 strtotime()接受格式化为日期的字符串,并将其转换为自epoch以来的秒数。

$time_from = strtotime($resttimefrom); 
$time_to = strtotime($resttimeto); 

附注:strtotime()总是返回整数形式的完整日期。如果你的字符串没有日期,只有一次,strtotime()返回今天的日期以及你在字符串中给出的时间。然而,这对你并不重要,因为strtotime()返回的两个日期将具有相同的日期,并且比较这两个变量将具有期望的效果,即在日期相互抵消时比较两次。

当您比较两个整数时请记住,日期/时间越早,其整数值越小。所以,如果你想看看是否$ time_from低于$ time_to早,你有这样的:

if ($time_from < $time_to) 
{ 
    // $time_from is ealier than $time_to 
} 

我们的日期/时间与当前系统日期/时间比较,只需使用mktime()不带参数表示当前日期/时间:

if ($time_from < mktime()) 
{ 
    // $time_from is in the past 
} 
+0

p.s.不要使用没有参数的mktime()。虽然这仍然有效,但现在已被弃用。使用time()来获得自epoch以来的秒数。 – emurano 2010-10-25 12:28:19

21

你可以尝试使用strtotime

$st_time = strtotime($resttimefrom); 
$end_time = strtotime($resttimeto); 
$cur_time = strtotime(now); 

然后检查

if($st_time < $cur_time && $end_time > $cur_time) 
{ 
    echo "WE ARE CLOSE NOW !!"; 
} 
else{ 
    echo "WE ARE OPEN NOW !!"; 
} 

我希望这可以帮助你..

+1

+1帮助,但为了避免错误“注意:现在使用未定义的常量 - 假定'now'”,将关键字封装到引号中 – MrSo 2016-08-05 08:20:34

0
$Time1 = date_parse($time); 
$seconds1 = $Time1['hour'] * 3600 + $Time1['minute'] * 60 + $Time1['second']; 

$Time2 = date_parse($current_time); 
$seconds2 = Time2['hour'] * 3600 + Time2['minute'] * 60 + Time2['second']; 

$actula_time = $seconds1 - $seconds2; 

echo floor($actula_time/3600) .":". floor(($actula_time/60)%60) .":". $actula_time%60;