Compare la fecha dada con hoy


216

He seguido

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

Me gustaría comparar esta fecha con la fecha de hoy (es decir, me gustaría saber si $vares antes de hoy o si es igual o no hoy)

¿Qué función necesitaría usar?


55
Sugeriría configurar la zona horaria también
NJInamdar

Respuestas:


289
strtotime($var);

Lo convierte en un valor de tiempo.

time() - strtotime($var);

Te da los segundos desde $var

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

Verificará si $varha estado dentro del último día.


1
para php 4, salga del último '.0' de $ var = "2010-01-21 00: 00: 00.0", de lo contrario, strtotime devolverá -1
vivoconunxino

1
Estoy usando PHP 7.1. La parte del segundo segundo simplemente se ignora, dado que el retorno es un número entero con el número de segundos.
Diogo Melo

209

Ese formato es perfectamente apropiado para una comparación de cadenas estándar, p. Ej.

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

Para obtener la fecha de hoy en ese formato, simplemente use: date("Y-m-d H:i:s") .

Entonces:

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

if ($date < $today) {}

Esa es la belleza de ese formato: ordena muy bien. Por supuesto, eso puede ser menos eficiente, dependiendo de sus circunstancias exactas, pero también podría ser mucho más conveniente y conducir a un código más fácil de mantener; necesitaríamos saber más para realmente tomar esa decisión.

Para la zona horaria correcta, puede usar, por ejemplo,

date_default_timezone_set('America/New_York');

Haga clic aquí para consultar las zonas horarias PHP disponibles.


2
Esto también ignora la zona horaria
anushr

@anushr, si se necesita una zona horaria en comparación, la diferencia horaria se puede agregar hasta la fecha antes de comparar. Esto es aún más rápido que intentar convertir dos cadenas mm/dd/yyyyde fecha y hora en formato a fecha y luego compararlo. Siempre me preocupa cuando los desarrolladores tienen fechas en múltiples zonas horarias en su sistema. Creo que es mejor almacenar fechas en su sistema, siempre en una zona horaria única y luego mostrarla en la zona horaria requerida. Comencé a usar el yyyy-mm-ddformato (o yyyymmdd) alrededor de 1998 cuando me di cuenta de que se ordena mucho más rápido incluso en el servidor SQL.
AaA

59

Aqui tienes:

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

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

Además, algunas funciones de ayuda más:

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

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

¿Por qué la extraña lógica al revés y los booleanos extraños? ¿Por qué no simplemente "return strtotime ($ time) == strtotime ('today')", "return strtotime ($ time)> time ()" y "return strtotime ($ time) <time ()"?
Bobby Jack

@Bobby Jack: Tenía más funcionalidad en esas funciones, olvidé eliminar el código adicional. Corregido ahora.
Alix Axel

+1 en la función auxiliar, específicamente isPast b / c Acabo de ejecutar a if(strtotime('2013-01-22 00:00:00.00') < time()){....}y eso lo hice por mí.
MDMoore313

47

Para completar BoBby Jack, el uso de DateTime OBject, si tiene php 5.2.2+:

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

}

Esto no es correcto. Si $ var es el día actual (después de la medianoche exacta), el nuevo DateTime () será más grande que el nuevo DateTime ($ var) y no es cierto que $ var sea antes de hoy.
dxvargas

46

Puedes usar la DateTimeclase:

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

Operadores de comparación de trabajo *:

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)

También es posible tomar los valores de la marca de tiempo de los objetos DateTime y compararlos:

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)

* Tenga en cuenta que ===devuelve falso al comparar dos objetos DateTime diferentes, incluso cuando representan la misma fecha.


$futureSe ha convertido en el pasado. : P
mbomb007

Dios mío, cómo pasa el tiempo.
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

eso no es lo que mi $varigual también en OP
alexus

1
Y necesita PHP> = 5.4 para (nuevo DateTime ()) -> formato ('Ym-d');
webrama.pl

6

Una advertencia basada en mi experiencia, si su propósito solo involucra la fecha, tenga cuidado de incluir la marca de tiempo . Por ejemplo, decir hoy es "2016-11-09". La comparación que implica la marca de tiempo anulará la lógica aquí. Ejemplo,

//  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.
}

El código anterior parece correcto, pero si SOLO es la fecha que desea comparar, entonces, el código anterior no es la lógica correcta. ¿Por qué? Porque, time () y strtotime () proporcionarán incluir la marca de tiempo. Es decir, a pesar de que ambas fechas caen en el mismo día, pero la diferencia en el tiempo será importante. Considere el siguiente ejemplo:

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

Debido a que la entrada es una cadena de fecha simple, el uso strtotime()de $inputsupondrá que es la medianoche del 09/11/2016. Por lo tanto, correr en time()cualquier momento después de la medianoche siempre tratará$input pasado, incluso si son el mismo día.

Para solucionar esto, simplemente puede codificar, así:

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

1
Estoy seguro de que OP consideró esto y es por eso que incluyeron '00: 00: 00.0' en su pregunta
AaA

6

¡Pocos años después, secundo la observación de Bobby Jack de que las últimas 24 horas no son hoy! Y me sorprende que la respuesta haya sido tan votada ...

Para comparar si una fecha determinada es menor, igual o mayor que otra, primero debe "rechazarlas" al comienzo del día. En otras palabras, asegúrese de estar hablando de la misma hora 00:00:00 en ambas fechas. Esto se puede hacer de manera simple y elegante como:

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

si $vartiene la parte de tiempo en 00:00:00 como el OP especificado.

Reemplazar <=> con lo que necesite (o manténgalo así en php 7)

Además, obviamente, estamos hablando de la misma zona horaria para ambos. Para la lista de zonas horarias compatibles


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

(el ejemplo de w3schools, funciona perfecto)


4

Ampliando la respuesta de Josua de w3schools:

//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';}

Espero que esto ayude. ¡Mi primer post en stackoverflow!


1

Comparar objetos de fecha y hora:

(Escogí 10 días; cualquier cosa anterior a 10 días es "ANTIGUA", de lo contrario, "NUEVA")

$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

¡Algunas respuestas dadas no tienen en consideración el día actual!

Aquí está mi propuesta.

$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

Si haces cosas con tiempo y fechas, Carbon es tu mejor amigo;

Instale el paquete entonces:

$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 = menor que, gt = mayor que

Como en la pregunta:

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

y mucho más;

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.