PHP:如何将时间字符串与日期进行比较(' H:i')?

时间:2012-05-08 11:43:22

标签: php datetime comparison

我将时间保存在数据库中,如下午7:30作为varchar字段。我想检查现在这个时间是否大于时间。

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

$my_time = '19:30';

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

问题是如果$ my_time是非空字符串,则上面将返回true。

strtotime($my_time)也没有帮助。

strtotime('H:i',$my_time)将其设为00:00。

当实际时间是17:09时,执行(int)date('H:i')将给出1700,所以删除冒号然后比较也不会有效....

在此上下文中,更改数据库时间数据是不可能的。

plz帮助。如果我说错了某些事实,请纠正我。

5 个答案:

答案 0 :(得分:11)

您可以使用:

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

答案 1 :(得分: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 ==).

答案 2 :(得分:3)

您不能将比较运算符与此类字符串一起使用,因为当您执行字符串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”的某些标量表示的结果不同,因此考虑适当的语义用于比较是个好主意。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

不要比较表示时间戳的字符串。而是使用strtotime()将任何这样的字符串转换为只是数字的Unix时间戳,然后进行比较。您可以使用time()获取当前时间的Unix时间戳:

$my_time = '19:30';

if (strtotime($my_time) > time()) {
    // do something ...
}