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 $var
c'est avant aujourd'hui ou est égal à aujourd'hui ou non)
Quelle fonction devrais-je utiliser?
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 $var
c'est avant aujourd'hui ou est égal à aujourd'hui ou non)
Quelle fonction devrais-je utiliser?
Réponses:
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 $var
a été dans le dernier jour.
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.
mm/dd/yyyy
de 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-dd
format (ou yyyymmdd
) vers 1998 lorsque j'ai réalisé qu'il triait beaucoup plus rapidement même dans SQL Server.
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());
}
if(strtotime('2013-01-22 00:00:00.00') < time()){....}
et cela l'a fait pour moi.
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
}
Vous pouvez utiliser la DateTime
classe:
$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.
$future
est devenu le passé. : P
$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
égaux aussi dans OP
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 $input
on supposera qu'il s'agit du minuit du 2016-11-09. Donc, courir time()
n'importe quand après minuit sera toujours considéré $input
comme 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.";
}
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 $var
a 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
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
(l'exemple w3schools, cela fonctionne parfaitement)
É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!
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');
}
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
}
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;