Comment puis-je comparer deux dates en PHP?


125

Comment puis-je comparer deux dates en PHP?

La date est stockée dans la base de données au format suivant

2011-10-2

Si je voulais comparer la date du jour à la date de la base de données pour voir laquelle est la plus grande, comment le ferais-je?

J'ai essayé ça,

$today = date("Y-m-d");
$expire = $row->expireDate //from db

if($today < $expireDate) { //do something; }

mais cela ne fonctionne pas vraiment de cette façon. Quelle est une autre façon de le faire?


Attribuez les dates de base de données à un objet DateTime, puis comparez ces objets. Vous pouvez trouver un bel exemple dans stackoverflow.com/questions/961074/…
Peter

Réponses:


80

dans la base de données la date ressemble à ceci 2011-10-2

Stockez-le dans AAAA-MM-JJ et la comparaison de chaînes fonctionnera car '1'> '0', etc.


2
mais que se passe-t-il s'ils ressemblent à ceci, 02/10/2011 et 10/02/2012, pour la comparaison du mois 1> 0, mais 02/10/2011 <10/02/2012
dav

14
@Davo, la comparaison s'arrête au premier caractère différent. Dans ce cas, le quatrième chiffre de «1» <«2», vous obtenez donc le résultat attendu.
Matthieu

1
Je suis désolé :), n'a pas été assez prudent.
dav

le suivant fonctionnera- 2016-03-27 11:59:47 ::: 2016-03-14 10:30:00t-il?
shorif2000

221

Si toutes vos dates sont postérieures au 1er janvier 1970, vous pouvez utiliser quelque chose comme:

$today = date("Y-m-d");
$expire = $row->expireDate; //from database

$today_time = strtotime($today);
$expire_time = strtotime($expire);

if ($expire_time < $today_time) { /* do Something */ }

Si vous utilisez PHP 5> = 5.2.0, vous pouvez utiliser la classe DateTime:

$today_dt = new DateTime($today);
$expire_dt = new DateTime($expire);

if ($expire_dt < $today_dt) { /* Do something */ }

Ou quelque chose du genre.


Si je me souviens bien, le problème 1st of January of 1970ne concerne que les anciennes versions de PHP fonctionnant sous Windows et cela n'a jamais été un problème sous Unix.
Álvaro González

J'aime cette réponse. C'est un excellent choix de convertir les dates en strtotime ()
Erich García

2
Ne serait-ce pas maintenant "Si toutes vos dates sont postérieures au 1er janvier 1970" et "antérieures à 2038"? surveillez notre bogue y2k38. strtotimeretournera false pour les dates plus grandes. stackoverflow.com/questions/2012589/…
blamb

Notez que la DateTimeméthode est la méthode préférée. Cet objet peut faire bien plus que strtotimejamais.
Machavity

new DateTime('now')fonctionne également pour récupérer la date d'aujourd'hui
Breith

23

Juste pour compléter les réponses déjà données, voyez l'exemple suivant:

$today = new DateTime('');
$expireDate = new DateTime($row->expireDate); //from database



if($today->format("Y-m-d") < $expireDate->format("Y-m-d")) { 
    //do something; 
}

Mise à jour: Ou utilisez simplement la fonction date () old-school :

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   

1
La date est une fonction, pas une classe / un constructeur.
spdionis

2
@spdionis merci pour le commentaire, j'ai changé la lettre majuscule pour éliminer toute confusion possible.
d.raev

6

Je ne ferais pas ça avec PHP. Une base de données doit savoir quel jour est aujourd'hui (utilisez MySQL-> NOW () par exemple), il sera donc très facile de comparer dans la requête et de renvoyer le résultat, sans aucun problème en fonction des types de date utilisés

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName

merci mais j'utilise en fait date () je ne stocke pas la date d'aujourd'hui dans une base de données
Sarmen B.

4
Mais vous stockez expireDate dans une base de données. Comparez cette date avec MAINTENANT ()
Dr.Molle

4
$today = date('Y-m-d');//Y-m-d H:i:s
$expireDate = new DateTime($row->expireDate);// From db 
$date1=date_create($today);
$date2=date_create($expireDate->format('Y-m-d'));
$diff=date_diff($date1,$date2);

//echo $timeDiff;
if($diff->days >= 30){
    echo "Expired.";
}else{
    echo "Not expired.";
}

2

Voici un moyen d'obtenir la différence entre deux dates en quelques minutes.

// set dates
$date_compare1= date("d-m-Y h:i:s a", strtotime($date1));
// date now
$date_compare2= date("d-m-Y h:i:s a", strtotime($date2));

// calculate the difference
$difference = strtotime($date_compare1) - strtotime($date_compare2);
$difference_in_minutes = $difference / 60;

echo $difference_in_minutes;

La question demande de comparer 2 dates - votre réponse est d'ajouter une charge de choses supplémentaires (par exemple, définir le statut en ligne / hors ligne) qui n'est pas nécessaire comme réponse à la question. La partie de votre réponse où la comparaison a lieu est pratiquement la même que la réponse déjà existante ici .
crazyloonybin

Mise à jour de la question, j'ai posté la mauvaise réponse dans la mauvaise question ^^;) Ce n'est pas la même chose que la réponse, il suffit d'ajouter mon entrée sur la façon de les comparer et d'obtenir la différence en quelques minutes.
Syno du

1
J'ai supprimé mon vote négatif à cause de votre mise à jour, ça a l'air beaucoup mieux maintenant :)
crazyloonybin

2

Vous pouvez convertir les dates en horodatages UNIX et comparer la différence entre eux en secondes.

$today_date=date("Y-m-d");
$entered_date=$_POST['date'];
$dateTimestamp1 = strtotime($today_date);
$dateTimestamp2 = strtotime($entered_date);
$diff= $dateTimestamp1-$dateTimestamp2;
//echo $diff;
if ($diff<=0)
   {
     echo "Enter a valid date";
   }

0

J'ai eu ce problème aussi et je le résolve en:

$today = date("Ymd");
$expire = str_replace('-', '', $row->expireDate); //from db

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
}

Pourquoi cette technique fonctionne doit être expliqué dans la réponse.
mickmackusa le

Veuillez répondre à la question posée par le PO, et non comment vous avez résolu votre propre scénario.
mickmackusa le

0

Voici mon tour sur la façon d'obtenir la différence en jours entre deux dates avec PHP. Notez l'utilisation de '!' au format pour supprimer la partie horaire des dates, grâce aux informations de DateTime createFromFormat sans heure .

$today = DateTime::createFromFormat('!Y-m-d', date('Y-m-d'));
$wanted = DateTime::createFromFormat('!d-m-Y', $row["WANTED_DELIVERY_DATE"]);
$diff = $today->diff($wanted);
$days = $diff->days;
if (($diff->invert) != 0) $days = -1 * $days;
$overdue = (($days < 0) ? true : false);
print "<!-- (".(($days > 0) ? '+' : '').($days).") -->\n";

-1

J'ai trouvé la réponse sur un blog et c'est aussi simple que:

strtotime(date("Y"."-01-01")) -strtotime($newdate))/86400

Et vous aurez les jours entre les 2 dates.


Cela semble résoudre un problème différent. Veuillez ne répondre qu'à la question posée par le PO.
mickmackusa le

-1

Cela fonctionne grâce à la logique de comparaison de chaînes de PHP. Vous pouvez simplement vérifier ...

if ($startdate < $date) {// do something} 
if ($startdate > $date) {// do something}

Les deux dates doivent être dans le même format. Les chiffres doivent être remplis de zéro vers la gauche et classés du plus significatif au moins significatif. Y-m-det Y-m-d H:i:sremplissez ces conditions.


1
d-m-Yne fonctionnera pas .. Y-m-d(avec un zéro non significatif comme le 08/05/2016) fonctionnera. Vérifiez ces dates au d-m-Yformat 01-10-2016et 20-02-2016, en comparant comme des chaînes 0 <2, il arrêtera de comparer mais de manière incorrecte ...
Arxeiss

Voici la preuve que votre technique ne parviendra pas à comparer correctement les dates de l'OP avec la date d'aujourd'hui: 3v4l.org/SNHKT
mickmackusa

L'OP a un format de date différent. la date ressemble 2011-10-2.
mickmackusa le

-1

Si vous voulez qu'une date ($ date) expire dans un certain intervalle, par exemple une date d'expiration de jeton lors d'une réinitialisation de mot de passe, voici comment procéder:

$date = $row->expireDate;

$date->add(new DateInterval('PT24H')); // adds 24 hours

$now = new \DateTime();

if($now < $date) { /* expired after 24 hours */ }

Mais dans votre cas, vous pouvez faire la comparaison comme suit:

$today = new DateTime('Y-m-d');

$date = $row->expireDate;

if($today < $date) { /* do something */ }

Cette réponse ignore la question initialement publiée. Veuillez utiliser les exemples de données fournis par l'OP.
mickmackusa

Ce n'est pas exactement ce que le gars demande de l'aide, mais j'ai pensé que cette façon pourrait aider si l'on comprend les principes.
faye.babacar78

Je comprends les principes, mais ce code ne répond pas à la question posée. Cette page est déjà remplie de réponses incorrectes et sans rapport - cela ne fait que confondre les chercheurs et leur fait perdre leur temps. J'essaye de chercher des chercheurs.
mickmackusa le

Eh bien, je pense que ce n'est pas si difficile, il aurait pu utiliser la classe DateTime () au lieu de la fonction date (). La réponse que j'ai donnée ci-dessus est en quelque sorte de donner des idées aux chercheurs.
faye.babacar78

1
Je vais arrêter de me répéter et me désengager de cette discussion. La deuxième solution la plus élevée ( stackoverflow.com/a/3847762/2943403 ) montre une manière terriblement simple (imbattable) de créer deux objets datetime. Je n'ai absolument aucune idée de ce que fait votre requestDate()méthode magique - il n'est mentionné nulle part. Je n'utiliserais pas votre réponse et je ne recommanderais à aucun chercheur d'utiliser votre solution. Je ne prévois pas changer mon vote.
mickmackusa le

-2

tout d'abord, essayez de donner le format que vous souhaitez à la date et l'heure actuelle de votre serveur:

  1. Obtenir la date et l'heure actuelle

    $ date_actuelle = getdate ();

  2. Séparez la date et l'heure pour les gérer comme vous le souhaitez:

$ current_date_only = $ current_date [year] .'- '. $ current_date [lun] .'-'. $ current_date [mday]; $ current_time_only = $ current_date ['hours']. ':'. $ current_date ['minutes']. ':'. $ current_date ['seconds'];

  1. Comparez-le selon si vous utilisez donly date ou datetime dans votre base de données:

    $ today = $ current_date_only. ' '. $ heure_actuelle_unique;

    ou

    $ today = $ current_date_only;

    if ($ aujourd'hui <$ expireDate)

J'espère que ça aide


Cette réponse ne tente pas de résoudre la question initiale. L'OP n'a aucun intérêt pour les heures, les minutes ou les secondes.
mickmackusa
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.