Y a-t-il un moyen de trouver la différence de mois dans PHP? J'ai la contribution de Date 2003-10-17 et à remettre à jour 2004-03-24. J'ai besoin de trouver combien de mois il y a dans ces deux jours. Dites si 6 mois, j'ai besoin de la production en mois seulement. Merci de me guider pour la différence de jour. P>
Je trouve la solution via MySQL mais j'en ai besoin chez PHP. Quelqu'un aidez-moi, merci d'avance. P>
13 Réponses :
Voici un rapide:
$date1 = mktime(0,0,0,10,0,2003); // m d y, use 0 for day $date2 = mktime(0,0,0,3,0,2004); // m d y, use 0 for day echo round(($date2-$date1) / 60 / 60 / 24 / 30);
Cela deviendra de plus en plus imprécis les deux autres dates et pourraient éventuellement faire tourner le mauvais moyen ...
Ce qui s'est passé si le mois a 31 jours code> au cas où janvier, mars, mai, juillet, août, octobre, décembre code> ou 28 jours code> au cas où < Code> Février Code>, coz que vous avez divisé par 30.
http://www.php.net/manual/fr/dateTime .diff.php p>
Ceci renvoie un objet de dateInterval qui a une méthode de format. P>
<?php # end date is 2008 Oct. 11 00:00:00 $_endDate = mktime(0,0,0,11,10,2008); # begin date is 2007 May 31 13:26:26 $_beginDate = mktime(13,26,26,05,31,2007); $timestamp_diff= $_endDate-$_beginDate +1 ; # how many days between those two date $days_diff = $timestamp_diff/2635200; ?> Reference: http://au.php.net/manual/en/function.mktime.php#86916
Même problème que la solution de @ Kai, une hypothèse très optimiste qu'un mois a 30 jours ...
Le moyen le plus simple sans réinventer la roue. Cela vous donnera la forte> pleine différence de mois forte>. C'est à dire. Les deux dates ci-dessous sont presque em> 76 mois d'intervalle, mais le résultat est de 75 mois. date_default_timezone_set('Asia/Tokyo'); // you are required to set a timezone
$date1 = new DateTime('2009-08-12');
$date2 = new DateTime('2003-04-14');
$diff = $date1->diff($date2);
echo (($diff->format('%y') * 12) + $diff->format('%m')) . " full months difference";
Excellent travail: juste une petite question dans cette façon de comporter le nombre de jours en utilisant ceci?
@noobie s'il vous plaît RTFM pour dateInterval :: Format Code> Pour trouver toutes les options de formatage possibles.
Résultats étranges: à partir de: 2013-03-01, jusqu'au: 2013-04-01, DIFF Année: 0, DIFF MOIS: 1, DIFS DAYS: 3. MOIS AVEC MOINS 31 JOURS DONNER également DIFF EN MOIS = 0
@thehpi intéressant. Mais cela est tenu d'impréciser tout ce que vous faites, car "un mois" est une unité de temps terriblement vague. Devrait-il compter comme un mois dès qu'une limite de mois est croisée entre deux dates? Ou seulement si un mois complet se situe entre eux? Qu'est-ce que "un mois complet"? 28 jours? 30? 31?
Utiliser avec précaution! Différence des mois entre le 01.01.2013 et le 31.03.2013 sera de 2 mois (pas 3 comme étant peut-être prévu!)
@ValenttinDespa en fait la différence entre le 01.01.2013 et le 31.03.2013 est 2 mois et 30 jours , ce qui est précis. Vous seriez une sorte une personne optimiste si vous vous attendez à une différence exacte de 3 mois :-)
Pour vous débarrasser de «opérateur de concaténation de chaîne erroné» dans la chaîne de coulée PHPSTorm sur INT: (((int) $ diff-> format ('% y') * 12) + (int) $ Diff-> Format ('% M' ));
2018-04-01 et 2018-07-01 devraient être une différence de 3 mois mais a reçu 2 mois.
Eh bien, cela revient à la façon dont vous définissez "un mois". C'est une définition incontrôlante de la vie. Apparemment, la définition de PHP et la vôtre diffère. Je vais inspecter la différence de jour restante et arrondir si nécessaire / assez proche.
Serait agréable de souligner que vous pouvez ajouter% R au format pour obtenir des valeurs négatives en fonction de la date du plus grand $ Diff-> format ('% R% Y') * 12) + $ Diff-> Format ('% R% m') code>
function monthsDif($start, $end)
{
// Assume YYYY-mm-dd - as is common MYSQL format
$splitStart = explode('-', $start);
$splitEnd = explode('-', $end);
if (is_array($splitStart) && is_array($splitEnd)) {
$startYear = $splitStart[0];
$startMonth = $splitStart[1];
$endYear = $splitEnd[0];
$endMonth = $splitEnd[1];
$difYears = $endYear - $startYear;
$difMonth = $endMonth - $startMonth;
if (0 == $difYears && 0 == $difMonth) { // month and year are same
return 0;
}
else if (0 == $difYears && $difMonth > 0) { // same year, dif months
return $difMonth;
}
else if (1 == $difYears) {
$startToEnd = 13 - $startMonth; // months remaining in start year(13 to include final month
return ($startToEnd + $endMonth); // above + end month date
}
else if ($difYears > 1) {
$startToEnd = 13 - $startMonth; // months remaining in start year
$yearsRemaing = $difYears - 2; // minus the years of the start and the end year
$remainingMonths = 12 * $yearsRemaing; // tally up remaining months
$totalMonths = $startToEnd + $remainingMonths + $endMonth; // Monthsleft + full years in between + months of last year
return $totalMonths;
}
}
else {
return false;
}
}
Modifié - changé $ début à la fin = 12 - $ startminth; à $ commencer à end = 13 - $ startmonth; Comme avant qu'il ne comptait pas la durée de décembre
WOW, moyen de dépasser le problème ... Que diriez-vous de cette version:
function monthsBetween($startDate, $endDate) {
$retval = "";
// Assume YYYY-mm-dd - as is common MYSQL format
$splitStart = explode('-', $startDate);
$splitEnd = explode('-', $endDate);
if (is_array($splitStart) && is_array($splitEnd)) {
$difYears = $splitEnd[0] - $splitStart[0];
$difMonths = $splitEnd[1] - $splitStart[1];
$difDays = $splitEnd[2] - $splitStart[2];
$retval = ($difDays > 0) ? $difMonths : $difMonths - 1;
$retval += $difYears * 12;
}
return $retval;
}
Je viens de modifier cette ligne $ retval = ($ difficile> 0)? $ DIFNONTHS: $ DIFMONTHS - 1; code> to $ retval = ($ difficile> = 0)? $ DIFMONTHS: $ DIFMONTHS - 1; code> La différence entre 2017-02-01 et 2017-03-01 est que 1
Après avoir testé des tonnes de solutions, la mise en place d'un test d'unité, c'est ce que je sors avec: par exemple, il retournera (les cas de test du test de l'unité): < / p> Avis: à cause de l'arrondi, cela fait avec les jours, même une moitié d'un mois sera arrondi, ce qui peut entraîner une question si vous l'utilisez avec certains cas. Alors ne l'utilisez pas pour de tels cas, cela vous causera des problèmes. P> Par exemple: p>
belle solution, par exemple 01.06 - 01.07 donne 0 mois (en m), mais en utilisant des jours et arrondir cela fonctionne correctement
Très bonne solution.
Je voulais juste ajouter ceci si quelqu'un cherche une solution simple qui compte chaque mois touché à la place de mois complets, des mois arrondis ou quelque chose comme ça.
// get year and month difference $a1 = '20170401'; $a2 = '20160101' $yearDiff = (substr($a1, 0, 4) - substr($a2, 0, 4)); $monthDiff = (substr($a1, 4, 2) - substr($a2, 4, 2)); $fullMonthDiff = ($yearDiff * 12) + $monthDiff; // fullMonthDiff = 16
Ceci est ma version améliorée de @Deceze Réponse:
/**
* @param string $startDate
* Current date is considered if empty string is passed
* @param string $endDate
* Current date is considered if empty string is passed
* @param bool $unsigned
* If $unsigned is true, difference is always positive, otherwise the difference might be negative
* @return int
*/
public static function diffInFullMonths($startDate, $endDate, $unsigned = false)
{
$diff = (new DateTime($startDate))->diff(new DateTime($endDate));
$reverse = $unsigned === true ? '' : '%r';
return ((int) $diff->format("{$reverse}%y") * 12) + ((int) $diff->format("{$reverse}%m"));
}
Le meilleur moyen.
résultat: p>
Dans mon cas, j'avais besoin de compter des derniers mois et des restes de jour comme mois aussi pour créer des étiquettes de diagrammes de ligne.
/**
* Calculate the difference in months between two dates
*
* @param \DateTime $from
* @param \DateTime $to
* @return int
*/
public static function diffInMonths(\DateTime $from, \DateTime $to)
{
// Count months from year and month diff
$diff = $to->diff($from)->format('%y') * 12 + $to->diff($from)->format('%m');
// If there is some day leftover, count it as the full month
if ($to->diff($from)->format('%d') > 0) $diff++;
// The month count isn't still right in some cases. This covers it.
if ($from->format('d') >= $to->format('d')) $diff++;
}
$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2013-1-13');
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('%a day %m month %y year');
Différence d'année de mois de jour en PHP
Bonjour, s'il vous plaît ajouter des explications à la raison pour laquelle c'est une solution. Merci
Quel est exactement un mois dans ce cas? Le mois civil? 30 jours?
Duplicates: Stackoverflow.com/search?q=date+Difference+PHP