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!";
}
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!";
}
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!";
}
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!";
}
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.
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
).
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!";
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.
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.
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";
}
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é.
Solution simple:
function betweenDates($cmpDate,$startDate,$endDate){
return (date($cmpDate) > date($startDate)) && (date($cmpDate) < date($endDate));
}