2012-05-08 40 views
6

我将时间保存在数据库中,如7:30 pm作为varchar字段。我想检查这个时间是否大于时间。PHP:如何比较时间字符串与日期('H:i')?

我转换的DB时间字符串转换成'19:30' ,现在我想要做这样的事情:

$my_time = '19:30'; 

if($my_time > date('H:i')) 
{ 
    do something ... 
} 

的问题是上面会返回总是真,如果$ my_time非空字符串。

strtotime($my_time)也没有帮助。

strtotime('H:i',$my_time)使它成为00:00。

(int)date('H:i')将给1700年的实际时间是17:09,因此删除冒号,然后比较不会太工作....

更改数据库时的数据是毫无疑问的在这方面。

plz help。如果我说错了一些事实,请纠正我。

+0

您应该使用本地日期时间字段而不是varchar。它会为你解决这个问题。 –

+0

http://stackoverflow.com/questions/961074/how-do-i-compare-two-datetime-objects-in-php-5-2-8 –

+0

我知道约翰......这是最大的问题。 –

回答

7

您可以使用此:

$myTime = '19:30'; 
if (date('H:i') == date('H:i', strtotime($myTime))) { 
    // do something 
} 
+0

上的C:\ wamp \ www \ workspace \ bigbite \ index_parallel.php中出现意外字符它正常工作...谢谢 –

+0

m使用这个.. –

+4

很多时间已经过去了,但是和直接比较两个字符串不一样吗?由于'date()'返回一个字符串,它就是这样做的:'if(date('H:i')== '19:30')'不是吗?,这与OP提到的是一样的试。这是因为'date('H:i',strtotime($ myTime))'返回原始的$ myTime值作为字符串!所以它和'$ myTime'相同,而不是'date('H:i',strtotime($ myTime))'.so是什么意思?我真的不明白。我错过了什么?为什么'if($ my_time> date('H:i'))'OP建议应该不起作用?因为它对我有用。 – DiegoDD

2

不能像这样的字符串使用比较运算符,因为当你做字符串get converted to numbers first

对于一个班轮解决方案,您可以使用strcmp

if(strcmp($my_time, date('H:i')) == 1) 
{ 
    do something ... 
} 

以上的条件是语义上等同于“如果$ my_time大于当前时间”,但只有当的格式字符串保持一致!如果由于某种原因$my_time的格式不直接对应于H:i模式,在代码中引入错误非常容易。

将值压缩到字符串通常不是您应该使用日期和时间的方式。更合适的解决方案是使用PHP 5.2.0中引入的本地DateTime类(John Conde已经在his answer中给出了一个示例)。

但是,将时间视为哑标量值也有一个可能的优点:结果与人类认为01:00始终晚于00:00一致。 DateTime方法取决于当地的时区和日期,并可能不总是给你预期的结果。例如:

// assume we are in London 
date_default_timezone_set('Europe/London'); 

// assume that today is March 25, 2012 
$date1 = new DateTime("2012-03-25 01:00:00"); 
$date2 = new DateTime("2012-03-25 02:00:00"); 

// and... 
if ($date1 == $date2) { 
    echo "WTF?!? Equal???"; 
} 

See it in action

该测试的结果与比较“01:00”和“02:00”的一些标量表示的结果不同,所以最好考虑一下比较的正确语义。

+0

它的工作...与印度,加尔各答时区。我想我可以在现场服务器上使用它。 –

1
$date1 = DateTime::createFromFormat('H:i', $my_time1); 
$date2 = new DateTime(); 
if ($date1 > $date2) 
{ 
    // do something 
} 
+0

+1和强制免责声明:根据当前日期和时区,特定值的测试结果可能会令人惊讶。 – Jon

+0

我收到以下错误:致命错误:带有消息'DateTime :: __ construct()的未捕获异常'异常'[datetime.--construct]:无法解析位置1(:)处的时间字符串(H:i):意外字符'in C:\ wamp \ www \ workspace \ bigbite \ index_parallel.php在线...................并且后面跟着警告:Exception:DateTime :: __ construct() [datetime.--construct]:无法解析位置1(:)处的时间字符串(H:i):在线 –

4

您可以建立一个新的DateTime对象,设置时间,日期随机。比较这两个对象。例如:

$my_time = new DateTime('January 1th 1970 19:30'); 
$comparable_time = new DateTime('January 1th 1970 '. date('H:i')); 
if($my_time < $comparable_time) { 
    // do something 
} else { 
    // do something else 
} 

请注意更改日志;

Version 5.2.2 DateTime object comparison with the comparison operators changed to work as expected. Previously, all DateTime objects were considered equal (using ==).