将给定日期与今天进行比较。

247

我有以下代码:

$var = "2010-01-21 00:00:00.0"

我想将这个日期与今天的日期进行比较(即我想知道这个$var是在今天之前还是等于今天还是不是)

我需要使用哪个函数?


6
我建议设置时区。 - Nagama Inamdar
14个回答

313
strtotime($var);

把它转换成时间值。

time() - strtotime($var);

返回自$var以来经过的秒数。

if((time()-(60*60*24)) < strtotime($var))

检查$var是否在最近一天内。


1
对于 PHP 4,请从 $var = "2010-01-21 00:00:00.0" 中去掉最后的 '.0',否则 strtotime 将返回 -1。 - javier_domenech
1
我正在使用PHP 7.1。子秒部分被忽略,因为返回的是带有秒数的整数。 - Diogo Melo

240

这种格式非常适合进行标准字符串比较,例如:

if ($date1 > $date2){
  //Action
}

要按照这种格式获取今天的日期,只需使用:date("Y-m-d H:i:s")

所以:

$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";

if ($date < $today) {}

这种格式的美妙之处在于它可以很好地排序。当然,根据你的具体情况,这可能会更低效,但它也可能更加方便并且可以导致更易于维护的代码 - 我们需要了解更多才能做出真正的判断。

要获取正确的时区,你可以使用,例如,

date_default_timezone_set('America/New_York');

点击这里查看可用的PHP时区。


3
这也忽略了时区。 - anushr
1
@anushr,如果需要比较时区,可以在比较之前将时间差添加到日期中。这仍然比尝试将两个以“mm/dd/yyyy”格式的日期时间字符串转换为日期并进行比较要快。当开发人员在其系统中具有多个时区的日期时,我总是感到担忧。我认为最好在您的系统中始终以单个时区存储日期,然后在所需的任何时区中显示它。自从我意识到即使在SQL服务器中,使用“yyyy-mm-dd”格式(或“yyyymmdd”)也可以更快地排序以来,我就开始使用它了,那是在1998年左右。 - AaA
我先前使用过类似的东西,但是有了这个易于访问的答案,在紧急情况下真的很有帮助。不确定为什么他们选择以秒为基础的那个作为“最佳选择”,而这个选项是字面日期! - CJT3
这对我来说很有效,对于那些在时区设置上苦苦挣扎的人,你可以在PHP文件中的任何位置包含代码date_default_timezone_set('America/New_York');。要仅获取日期,请使用代码date("Y-m-d") - chanaka wickramasinghe

62

这是您需要的:

function isToday($time) // midnight second
{
    return (strtotime($time) === strtotime('today'));
}

isToday('2010-01-22 00:00:00.0'); // true

另外,还有一些辅助函数:

function isPast($time)
{
    return (strtotime($time) < time());
}

function isFuture($time)
{
    return (strtotime($time) > time());
}

为什么要使用奇怪的倒推逻辑和多余的布尔值?为什么不直接使用"return strtotime($time) == strtotime('today')"、"return strtotime($time) > time()"和"return strtotime($time) < time()"呢? - Bobby Jack
@Bobby Jack:那些函数里有更多的功能,我忘了删除额外的代码。现在已经修复了。 - Alix Axel
在辅助函数上加个+1,尤其是isPast函数,因为我刚运行了一个if(strtotime('2013-01-22 00:00:00.00') < time()){....},它对我很有用。 - MDMoore313

57

你可以使用DateTime类:

$past   = new DateTime("2010-01-01 00:00:00");
$now    = new DateTime();
$future = new DateTime("2021-01-01 00:00:00");

比较运算符起作用*:

var_dump($past   < $now);         // bool(true)
var_dump($future < $now);         // bool(false)

var_dump($now == $past);          // bool(false)
var_dump($now == new DateTime()); // bool(true)
var_dump($now == $future);        // bool(false)

var_dump($past   > $now);         // bool(false)
var_dump($future > $now);         // bool(true)

还可以从 DateTime 对象中获取时间戳并进行比较:

var_dump($past  ->getTimestamp());                        // int(1262286000)
var_dump($now   ->getTimestamp());                        // int(1431686228)
var_dump($future->getTimestamp());                        // int(1577818800)
var_dump($past  ->getTimestamp() < $now->getTimestamp()); // bool(true)
var_dump($future->getTimestamp() > $now->getTimestamp()); // bool(true)

* 注意,即使两个DateTime对象表示相同的日期,当比较它们时===会返回false。


6
$future已成为过去。 :P - mbomb007
6
我的,时间过得真快。 - Salman A

47

如果你的PHP版本是5.2.2或以上,要完成BoBby Jack,需要使用DateTime对象:

if(new DateTime() > new DateTime($var)){
    // $var is before today so use it

}

1
这是不正确的。如果$var是当前日期(准确到午夜后),则new DateTime()将比new DateTime($var)大,而$var早于今天是不正确的。 - dxvargas

12
$toBeComparedDate = '2014-08-12';
$today = (new DateTime())->format('Y-m-d'); //use format whatever you are using
$expiry = (new DateTime($toBeComparedDate))->format('Y-m-d');

var_dump(strtotime($today) > strtotime($expiry)); //false or true

这不是我的 $var 在 OP 中的值。 - alexus
1
你需要 PHP >= 5.4 才能运行 (new DateTime())->format('Y-m-d'); - webrama.pl

6
几年后,我赞同Bobby Jack的观察:过去的24小时并不是今天!我很惊讶这个答案得到了如此多的点赞...
要比较某个日期是否小于、等于或大于另一个日期,首先需要将它们“降低”到当天的开始。换句话说,请确保在两个日期中都是指的同一天的00:00:00时间。 可以简单而优雅地完成这一操作,方法如下:
strtotime("today") <=> strtotime($var)

如果$var的时间部分是00:00:00(就像OP指定的那样)。

用你需要的任何东西替换<=>(或在php 7中保持不变)

当然,我们正在讨论相同的时区。有关支持的时区列表


6

根据我的经验,有一个需要注意的点,如果您的目的仅涉及日期,则要小心包含时间戳。例如,假设今天是"2016-11-09"。涉及时间戳的比较会使逻辑无效。例如:

//  input
$var = "2016-11-09 00:00:00.0";

//  check if date is today or in the future
if ( time() <= strtotime($var) ) 
{
    //  This seems right, but if it's ONLY date you are after
    //  then the code might treat $var as past depending on
    //  the time.
}

以上代码看起来没问题,但如果你只想比较日期,那么上述代码就不是正确的逻辑。为什么?因为time()和strtotime()将提供包含时间戳。也就是说,即使两个日期都是在同一天,时间的差异也会很重要。请考虑下面的例子:

//  plain date string
$input = "2016-11-09";

因为输入是普通的日期字符串,使用strtotime()$input上将假定它是2016-11-09午夜。因此,在午夜之后的任何时间运行time()将始终将$input视为过去,即使它们在同一天。

要解决此问题,您可以简单编写以下代码:

if (date("Y-m-d") <= $input)
{
    echo "Input date is equal to or greater than today.";
}

1
我相信 OP 考虑到了这一点,这也是他们在问题中包含 `00:00:00.0' 的原因。 - AaA

5
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);

(这是w3schools的例子,它运行得很完美)

4

在w3schools上,基于Josua的答案作进一步的扩展:

//create objects for the dates to compare
$date1=date_create($someDate);
$date2=date_create(date("Y-m-d"));
$diff=date_diff($date1,$date2);
//now convert the $diff object to type integer
$intDiff = $diff->format("%R%a");
$intDiff = intval($intDiff);
//now compare the two dates
if ($intDiff > 0)  {echo '$date1 is in the past';}
else {echo 'date1 is today or in the future';}

我希望这可以帮到你。这是我在stackoverflow上的第一篇帖子!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接