web-dev-qa-db-fra.com

PHP vérifier si date entre deux dates

J'ai reçu ce code de Stackoverflow et l'ai légèrement modifié pour qu'il corresponde à la date du jour.

Je veux vérifier si aujourd'hui se situe entre deux dates. Mais ça ne marche pas ... Qu'est-ce qui me manque?

$paymentDate = date('d/m/Y');
echo $paymentDate; // echos today! 
$contractDateBegin = date('d/m/Y', '01/01/2001');
$contractDateEnd = date('d/m/Y', '01/01/2015');

if ($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd)
{
  echo "is between";
}
else
{
echo "NO GO!";  
}
50
Papa De Beau

C’est la bonne réponse pour votre code .. Il suffit d’utiliser strtotime () php

$paymentDate = date('Y-m-d');
$paymentDate=date('Y-m-d', strtotime($paymentDate));
//echo $paymentDate; // echos today! 
$contractDateBegin = date('Y-m-d', strtotime("01/01/2001"));
$contractDateEnd = date('Y-m-d', strtotime("01/01/2012"));

if (($paymentDate > $contractDateBegin) && ($paymentDate < $contractDateEnd)){
    echo "is between";
}else{
    echo "NO GO!";  
}
126
g.m.ashaduzzaman

Vous ne pouvez pas comparer les chaînes de date. C'est une bonne habitude d'utiliser l'objet DateTime de PHP à la place:

$paymentDate = new DateTime(); // Today
echo $paymentDate->format('d/m/Y'); // echos today! 
$contractDateBegin = new DateTime('2001-01-01');
$contractDateEnd  = new DateTime('2015-01-01');

if (
  $paymentDate->getTimestamp() > $contractDateBegin->getTimestamp() && 
  $paymentDate->getTimestamp() < $contractDateEnd->getTimestamp()){
  echo "is between";
}else{
   echo "NO GO!";  
}
28
luttkens

Si les heures comptent:

$paymentDate = strtotime(date("Y-m-d H:i:s"));
$contractDateBegin = strtotime("2014-01-22 12:42:00");
$contractDateEnd = strtotime("2014-01-22 12:50:00");

if($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd) {
   echo "is between";
} else {
    echo "NO GO!";  
}    
14

Vous comparez les dates sous forme de chaînes, ce qui ne fonctionnera pas car la comparaison est lexicographique. C'est le même problème que lors du tri d'un fichier texte, une ligne 20 apparaît après une ligne 100 car le contenu n'est pas traité comme un nombre mais comme une séquence de codes ASCII. En outre, les dates créées sont toutes incorrectes car vous utilisez une chaîne de format de chaîne dans laquelle un horodatage est attendu (deuxième argument).

Au lieu de cela, comparez les horodatages des objets DateTime, par exemple:

 $paymentDate = date_create();
 $contractDateBegin = date_create_from_format('d/m/Y', '01/01/2001');
 $contractDateEnd = date_create_from_format('d/m/Y', '01/01/2015');

Vos conditions existantes fonctionneront alors correctement.

4
Jon

Une autre solution aurait été de considérer la date écrite sous la forme Ymd.

Écrit dans ce "format", il est beaucoup plus facile de comparer les dates.

$paymentDate       = date('Ymd'); // on 4th may 2016, would have been 20160504
$contractBegin     = 20010101;
$contractEnd       = 20160101;
echo ($paymentDate >= $contractBegin && $paymentDate <= $contractEnd) ? "Between" : "Not Between";

Cela fonctionnera toujours pour chaque jour de l'année et ne dépendra d'aucune fonction ou conversion (PHP considérera la valeur int de $paymentDate à comparer avec la valeur int de contractBegin et contractEnd).

2
ChtiSeb

Basé sur la réponse de luttken. Je pensais ajouter mon twist :)

function dateIsInBetween(\DateTime $from, \DateTime $to, \DateTime $subject)
{
    return $subject->getTimestamp() > $from->getTimestamp() && $subject->getTimestamp() < $to->getTimestamp() ? true : false;
}

$paymentDate       = new \DateTime('now');
$contractDateBegin = new \DateTime('01/01/2001');
$contractDateEnd   = new \DateTime('01/01/2016');

echo dateIsInBetween($contractDateBegin, $contractDateEnd, $paymentDate) ? "is between" : "NO GO!";
1
Vigintas Labakojis

Utiliser directement

$paymentDate = strtotime(date("d-m-Y"));
$contractDateBegin = strtotime("01-01-2001");
$contractDateEnd = strtotime("01-01-2015");

La comparaison sera alors correcte car votre 01-01-2015 est valable pour la plage de dates 32 bits de PHP, indiquée dans le manuel de strtotime.

0
1000Gbps

Une autre solution (en supposant que vos formats de date sont toujours AAAA/MM/JJ avec des zéros en tête) est la fonction max () et min (). Je suppose que cela est correct étant donné toutes les autres réponses supposons également le format aaaa-mm-jj et qu’il s’agit de la convention de dénomination commune pour les dossiers dans les systèmes de fichiers si vous souhaitez vous assurer de les avoir triés par ordre chronologique.

Comme d'autres l'ont dit, étant donné l'ordre des nombres, vous pouvez comparer les chaînes, inutile d'utiliser la fonction strtotime ().

Exemples:

$biggest = max("2018/10/01","2018/10/02");

L'avantage étant que vous pouvez y coller plus de dates au lieu de simplement comparer deux.

$biggest = max("2018/04/10","2019/12/02","2016/03/20");

Pour déterminer si une date se situe entre deux dates, vous pouvez comparer Le résultat de min () et de max ()

$startDate="2018/04/10";
$endDate="2018/07/24";
$check="2018/05/03";
if(max($startDate,$check)==min($endDate,$check)){
    // It's in the middle
}

Cela ne fonctionnerait avec aucun autre format de date, mais pour celui-ci, il le ferait. Pas besoin de convertir en secondes et pas besoin de fonctions de date.

0
Adam Whateverson

Si vous avez besoin de dates entre parenthèses dynamiques.

$todayStr = date('Y-m-d');
$todayObj=date('Y-m-d', strtotime($todayStr));
$currentYrStr =  date('Y');
$DateBegin = date('Y-m-d', strtotime("06/01/$currentYrStr"));
$DateEnd = date('Y-m-d', strtotime("10/01/$currentYrStr"));
if (($todayObj > $contractDateBegin) && ($paymentDate < $contractDateEnd)){
    $period="summer";
}else{
   $period="winter";  
}
0
Jim Turner

Les méthodes ci-dessus sont utiles, mais elles ne sont pas complètes, car elles donneront une erreur si l'heure se situe entre 12h00 et 1h00. Il retournera le "No Go" malgré le fait qu'il soit entre les temps. Voici le code pour le même:

$time = '2019-03-27 12:00 PM';

$date_one = $time; 
$date_one = strtotime($date_one);
$date_one = strtotime("+60 minutes", $date_one);
$date_one =  date('Y-m-d h:i A', $date_one);

$date_ten = strtotime($time); 
$date_ten = strtotime("-12 minutes", $date_ten); 
$date_ten = date('Y-m-d h:i A', $date_ten);

$paymentDate='2019-03-27 12:45 AM';

$contractDateBegin = date('Y-m-d h:i A', strtotime($date_ten)); 
$contractDateEnd = date('Y-m-d h:i A', strtotime($date_one));

echo $paymentDate; 
echo "---------------"; 
echo $contractDateBegin; 
echo "---------------"; 
echo $contractDateEnd; 
echo "---------------";

$contractDateEnd='2019-03-27 01:45 AM';

if($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd)  
{  
 echo "is between";
} 
else
{  
  echo "NO GO!";  
}

Ici, vous obtiendrez la sortie "NO Go" car 12:45 > 01:45.

Pour obtenir la date de sortie appropriée entre les deux, assurez-vous que pour "AM" les valeurs de 01:00 AM à 12:00 AM seront converties au format 24 heures. Cette petite astuce m'a aidé.

0
pohankar gaurang

Solution simple:

function betweenDates($cmpDate,$startDate,$endDate){ 
   return (date($cmpDate) > date($startDate)) && (date($cmpDate) < date($endDate));
}
0
Spock