10

我将时间保存在数据库中,例如晚上 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 时, doing(int)date('H:i')将给出 1700,因此删除冒号然后比较也行不通....

在这种情况下,更改数据库时间数据是没有问题的。

请帮忙。如果我陈述了一些错误的事实,请纠正我。

4

5 回答 5

14

你可以使用这个:

$myTime = '19:30';
if (date('H:i') == date('H:i', strtotime($myTime))) {
    // do something
}
于 2012-05-08T11:47:44.993 回答
5

您可以构造一个新的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 ==).
于 2012-05-08T11:48:39.593 回答
3

您不能将比较运算符与这样的字符串一起使用,因为当您这样做时,字符串首先会转换为数字

对于单线解决方案,您可以使用strcmp

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

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

将值简化为字符串通常不是使用日期和时间的方式。更合适的解决方案是使用 PHP 5.2.0 中引入的原生类(John Conde 在他的回答DateTime中已经给出了一个例子)。

然而,将时间视为愚蠢的标量值还有一个可能的优势:结果与人类的看法一致,即 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???";
}

看到它在行动

此测试的结果与比较“01:00”和“02:00”的一些标量表示不同,因此最好考虑比较的正确语义是什么。

于 2012-05-08T11:45:41.903 回答
1
$date1 = DateTime::createFromFormat('H:i', $my_time1);
$date2 = new DateTime();
if ($date1 > $date2)
{
     // do something   
}
于 2012-05-08T11:46:16.347 回答
0

不要比较代表时间戳的字符串。相反,使用strtotime()将任何此类字符串转换为只是数字的 Unix 时间戳,然后比较它们。您可以使用以下命令获取当前时间的 Unix 时间戳time()

$my_time = '19:30';

if (strtotime($my_time) > time()) {
    // do something ...
}
于 2019-12-10T19:20:44.567 回答