PHP:如何比较时间字符串和日期('H:i')?

q8l4jmvw  于 2023-04-28  发布在  PHP
关注(0)|答案(5)|浏览(99)

我有时间保存在数据库中,如下午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
执行(int)date('H:i')将在实际时间为17:09时给予1700,因此删除冒号然后进行比较也不起作用。...
在这种情况下,更改数据库时间数据是不可能的。
请帮助。纠正我,如果我说错了一些事实。

eyh26e7m

eyh26e7m1#

您可以使用以下命令:

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

lfapxunr2#

您可以构造一个新的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 ==).
pnwntuvh

pnwntuvh3#

你不能对这样的字符串使用比较运算符,因为当你处理字符串get converted to numbers first时。
对于一行程序解决方案,可以使用strcmp

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

上面的条件在语义上等同于“if $my_time is greater than the current time”,* 但前提是字符串的格式保持一致!*很容易在此代码中引入bug如果由于任何原因$my_time的格式与H:i模式不直接对应。
将值简化为字符串通常不是使用日期和时间的方式。更合适的解决方案是使用PHP5中引入的原生DateTime类。2.0(John孔德已经在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”的一些标量表示的结果不同,所以最好考虑一下比较的正确语义是什么。

vsnjm48y

vsnjm48y4#

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

von4xj4u5#

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

$my_time = '19:30';

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

相关问题