将给定日期与今天比较


216

我有以下

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

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

我需要使用什么功能?


5
我建议同时设置时区
NJInamdar 2014年

Answers:


289
strtotime($var);

将其转换为时间值

time() - strtotime($var);

给你几秒钟 $var

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

将检查是否$var已在最后一天之内。


1
for php 4退出$ var =“ 2010-01-21 00:00:00.0”的最后一个'.0',否则strtotime将返回-1
vivoconunxino 2014年

1
我正在使用PHP 7.1。考虑到返回值是带有秒数的整数,因此将忽略亚秒级的部分。
Diogo Melo

208

该格式非常适合标准字符串比较,例如

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时区。


2
这也忽略了时区
anushr

@anushr,如果需要比较时区,则可以在比较之前将时差添加到日期。这仍然比尝试将两个mm/dd/yyyy格式的日期时间字符串转换为日期然后进行比较要快。当开发人员的系统中有多个时区的日期时,我总是很担心。我认为最好将日期存储在系统中,始终在单个时区中,然后在所需的任何时区中显示它。我在1998年左右开始使用yyyy-mm-ddformat(或yyyymmdd),当时我意识到即使在SQL Server中,它的排序速度也要快得多。
AaA

59

干得好:

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:我在这些功能中有更多功能,忘了删除多余的代码。立即修复。
Alix Axel,2010年

辅助函数+1,特别是isPast b / c,我刚刚运行了a if(strtotime('2013-01-22 00:00:00.00') < time()){....},就为我做了。
MDMoore313

47

要完成BoBby Jack,请使用DateTime对象,如果您使用的是PHP 5.2.2+:

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

}

这是不正确的。如果$ var是当前日期(精确到午夜之后),则新的DateTime()会比新的DateTime($ var)大,而$ var不在今天之前。
dxvargas

46

您可以使用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。


$future已经成为过去。:P
mbomb007

我的,时间过得真快。
Salman A

13
$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 2014年

1
并且您需要PHP> = 5.4用于(new DateTime())-> format('Ym-d');
webrama.pl 2015年

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()on $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

6

几年后,我第二次接受鲍比·杰克(Bobby Jack)的观察,认为今天不是24小时!令我惊讶的是答案如此之高...

要比较某个日期是否小于,等于或大于另一个日期,首先需要将它们“调低”到一天的开始。换句话说,请确保两个日期都在谈论相同的00:00:00时间。这可以通过以下方式简单而优雅地完成:

strtotime("today") <=> strtotime($var)

如果$var时间部分指定为00:00:00(如指定的OP)。

替换<=>为您需要的任何内容(或将其保留在php 7中)

同样,很明显,我们在谈论两个时区。有关受支持的时区的列表


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的第一篇文章!


1

比较日期时间对象:

(我选择了10天-超过10天的都是“旧”,否则为“新”)

$now   = new DateTime();
$diff=date_diff($yourdate,$now);
$diff_days = $diff->format("%a");
if($diff_days > 10){
    echo "OLD! " . $yourdate->format('m/d/Y');
}else{
    echo "NEW! " . $yourdate->format('m/d/Y');
}

1

今天给出的一些答案没有考虑在内!

这是我的建议。

$var = "2010-01-21 00:00:00.0"
$given_date = new \DateTime($var);

if ($given_date == new \DateTime('today')) {
  //today
}

if ($given_date < new \DateTime('today')) {
  //past
}

if ($given_date > new \DateTime('today')) {
  //future
}

0

如果您有时间和日期做事,Carbon是您最好的朋友;

然后安装软件包:

$theDay = Carbon::make("2010-01-21 00:00:00.0");

$theDay->isToday();
$theDay->isPast();
$theDay->isFuture();
if($theDay->lt(Carbon::today()) || $theDay->gt(Carbon::today()))

lt =小于,gt =大于

如问题所示:

$theDay->gt(Carbon::today()) ? true : false;

以及更多;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.