Comparer la date donnée avec celle d'aujourd'hui

216

J'ai suivi

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

Je voudrais comparer cette date avec la date d'aujourd'hui (c'est-à-dire que j'aimerais savoir si $varc'est avant aujourd'hui ou est égal à aujourd'hui ou non)

Quelle fonction devrais-je utiliser?

alexus
la source
5
Je suggère également de définir le fuseau horaire
NJInamdar

Réponses:

289
strtotime($var);

Le transforme en valeur temporelle

time() - strtotime($var);

Vous donne les secondes depuis $var

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

Vérifie si $vara été dans le dernier jour.

Tyler Carter
la source
1
pour php 4, quittez le dernier '.0' de $ var = "2010-01-21 00: 00: 00.0", sinon strtotime renverra -1
vivoconunxino
1
J'utilise PHP 7.1. La partie de la seconde est juste ignorée, étant donné que le retour est un entier avec le nombre de secondes.
Diogo Melo
209

Ce format est parfaitement approprié pour une comparaison de chaînes standard, par exemple

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

Pour obtenir la date d'aujourd'hui dans ce format, utilisez simplement: date("Y-m-d H:i:s").

Alors:

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

if ($date < $today) {}

C'est la beauté de ce format: il commande bien. Bien sûr, cela peut être moins efficace, selon votre situation exacte, mais cela pourrait également être beaucoup plus pratique et conduire à un code plus maintenable - nous aurions besoin d'en savoir plus pour vraiment faire ce jugement.

Pour le fuseau horaire correct, vous pouvez utiliser, par exemple,

date_default_timezone_set('America/New_York');

Cliquez ici pour vous référer aux fuseaux horaires PHP disponibles.

Bobby Jack
la source
2
Cela ignore également le fuseau horaire
anushr
@anushr, si le fuseau horaire est nécessaire en comparaison, un décalage horaire peut être ajouté à ce jour avant la comparaison. C'est toujours plus rapide que d'essayer de convertir deux chaînes mm/dd/yyyyde date et d' heure au format en date, puis de les comparer. Cela m'inquiète toujours lorsque les développeurs ont des dates dans plusieurs fuseaux horaires dans leur système. Je pense qu'il est préférable de stocker les dates dans votre système, toujours dans un seul fuseau horaire, puis de les afficher dans le fuseau horaire requis. J'ai commencé à utiliser le yyyy-mm-ddformat (ou yyyymmdd) vers 1998 lorsque j'ai réalisé qu'il triait beaucoup plus rapidement même dans SQL Server.
AaA
59

Voici:

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

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

En outre, quelques fonctions d'assistance supplémentaires:

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

function isFuture($time)
{
    return (strtotime($time) > time());
}
Alix Axel
la source
Pourquoi la logique à l'envers bizarre et les booléens superflus? Pourquoi ne pas simplement "retourner strtotime ($ time) == strtotime ('today')", "return strtotime ($ time)> time ()" et "return strtotime ($ time) <time ()"?
Bobby Jack
@Bobby Jack: J'avais plus de fonctionnalités dans ces fonctions, j'ai oublié de supprimer le code supplémentaire. Fixé maintenant.
Alix Axel
+1 sur la fonction d'assistance, en particulier isPast b / c Je viens de lancer un if(strtotime('2013-01-22 00:00:00.00') < time()){....}et cela l'a fait pour moi.
MDMoore313
47

Pour terminer BoBby Jack, l'utilisation de DateTime OBject, si vous avez php 5.2.2+:

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

}
kamakazuu
la source
Ce n'est pas correct. Si $ var est le jour actuel (après minuit exact), le nouveau DateTime () sera plus grand que le nouveau DateTime ($ var) et ce n'est pas vrai que $ var est avant aujourd'hui.
dxvargas
46

Vous pouvez utiliser la DateTimeclasse:

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

Les opérateurs de comparaison fonctionnent *:

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)

Il est également possible de récupérer les valeurs d'horodatage des objets DateTime et de les comparer:

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)

* Notez que ===renvoie false lors de la comparaison de deux objets DateTime différents même s'ils représentent la même date.

Salman A
la source
$futureest devenu le passé. : P
mbomb007
Mon, comme le temps passe vite.
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
Hassan
la source
ce n'est pas ce que mes $varégaux aussi dans OP
alexus
1
Et vous avez besoin de PHP> = 5.4 pour (new DateTime ()) -> format ('Ym-d');
webrama.pl
6

Une mise en garde basée sur mon expérience, si votre objectif ne concerne que la date, veillez à inclure l'horodatage . Par exemple, disons qu'aujourd'hui l'est "2016-11-09". La comparaison impliquant l'horodatage annulera la logique ici. Exemple,

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

Le code ci-dessus semble correct, mais si c'est UNIQUEMENT la date que vous souhaitez comparer, le code ci-dessus n'est pas la bonne logique. Pourquoi? Parce que time () et strtotime () fourniront un horodatage inclus. C'est-à-dire, même si les deux dates tombent le même jour, mais la différence de temps aura de l'importance. Considérez l'exemple ci-dessous:

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

Parce que l'entrée est une chaîne de date ordinaire, l'utilisation strtotime()de $inputon supposera qu'il s'agit du minuit du 2016-11-09. Donc, courir time()n'importe quand après minuit sera toujours considéré $inputcomme passé, même si c'est le même jour.

Pour résoudre ce problème, vous pouvez simplement coder, comme ceci:

if (date("Y-m-d") <= $input)
{
    echo "Input date is equal to or greater than today.";
}
Lynnell Emmanuel Neri
la source
1
Je suis sûr qu'OP a considéré cela et c'est pourquoi ils ont inclus `00: 00: 00.0 'dans leur question
AaA
6

Quelques années plus tard, j'appuie l'observation de Bobby Jack selon laquelle les dernières 24 heures ne sont pas aujourd'hui !!! Et je suis surpris que la réponse ait été tellement appréciée ...

Pour comparer si une certaine date est inférieure, égale ou supérieure à une autre, vous devez d'abord les "baisser" jusqu'au début de la journée. En d'autres termes, assurez-vous que vous parlez de la même heure 00:00:00 dans les deux dates. Cela peut être fait simplement et élégamment comme:

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

si $vara la partie heure à 00:00:00 comme l'OP spécifié.

Remplacez <=>par tout ce dont vous avez besoin (ou conservez-le comme ceci dans php 7)

De plus, évidemment, nous parlons du même fuseau horaire pour les deux. Pour la liste des fuseaux horaires pris en charge

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

(l'exemple w3schools, cela fonctionne parfaitement)

Richard de Ree
la source
4

Étendre la réponse 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';}

J'espère que ça aide. Mon premier post sur stackoverflow!

enceladus
la source
1

Comparer les objets date-heure:

(J'ai choisi 10 jours - Tout ce qui a plus de 10 jours est "VIEUX", sinon "NOUVEAU")

$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');
}
Kevin
la source
1

Certaines réponses données ne tiennent pas compte de la journée en cours!

Voici ma proposition.

$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
}
dxvargas
la source
0

Si vous faites des choses avec l'heure et les dates, Carbon est votre meilleur ami;

Installez le package puis:

$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 = inférieur à, gt = supérieur à

Comme dans la question:

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

et beaucoup plus;

Lucas M. Oliveira
la source