Comment trouver le dernier jour du mois à partir de la date?

382

Comment obtenir le dernier jour du mois en PHP?

Donné:

$a_date = "2009-11-23"

Je veux le 2009-11-30; et étant donné

$a_date = "2009-12-23"

Je veux le 2009-12-31.

Mithun Sreedharan
la source

Réponses:

805

trenvoie le nombre de jours dans le mois d'une date donnée (voir la documentation pourdate ):

$a_date = "2009-11-23";
echo date("Y-m-t", strtotime($a_date));
Dominic Rodger
la source
99
Cela échouera après l'année 2038. Ainsi, au lieu de strtotime, la fonction DateTime doit être utilisée. Le code suivant fonctionnera sans problème de l'année 2038: $ d = new DateTime ('2009-11-23'); echo $ d-> format ('Ymt');
Mugunth
74
@Mugunth Si vous travaillez avec des dates dans 24 ans, vous risquez de rencontrer des problèmes avant 2038.Cependant, les serveurs passent déjà à une architecture 64 bits, ce qui nous donnera environ 292 milliards d'années pour corriger le problème.
Aucun
1
dans procédural -> $ date1 = $ year .'- '. $ month; $ d = date_create_from_format ('Y-m', $ date1); $ last_day = date_format ($ d, 't');
kayla
11
Avec DateTimevous pouvez faire quelque chose comme ça:(new DateTime('2009-11-23'))->modify('last day of')
Victor
Si vous utilisez Carbon PHP, vous pouvez utiliser getter
DaysInMonth
119

Le code utilisant strtotime () échouera après l'année 2038. (comme indiqué dans la première réponse de ce fil) Par exemple, essayez d'utiliser ce qui suit:

$a_date = "2040-11-23";
echo date("Y-m-t", strtotime($a_date));

Il donnera la réponse comme: 1970-01-31

Ainsi, au lieu de strtotime, la fonction DateTime doit être utilisée. Le code suivant fonctionnera sans problème de l'année 2038:

$d = new DateTime( '2040-11-23' ); 
echo $d->format( 'Y-m-t' );
Mugunth
la source
17
J'aurai 71 ans et je serai à la retraite d'ici là, donc ce n'est pas un problème pour moi! j / k Mais sérieusement les gens - tenez compte de cet avertissement!
Volomike
17
Cela suppose que vous exécutez une version 32 bits de PHP.
Aucun
pourquoi ce fait alarmant sur strtotime n'est-il pas mentionné dans le doc php php.net/manual/de/function.strtotime.php ?
Adam
1
@Adam C'est maintenant, je ne sais pas si c'était quand vous avez vérifié. php.net/manual/de/…
Mave
1
Depuis 2018, le strtotimecode me donne ce résultat: 2040-11-30
Jee
104

Je sais que c'est un peu tard mais je pense qu'il existe une façon plus élégante de le faire PHP 5.3+en utilisant la classe DateTime :

$date = new DateTime('now');
$date->modify('last day of this month');
echo $date->format('Y-m-d');
Hannoun Yassir
la source
20
Sur une ligne: $ date = new DateTime ('dernier jour de ce mois');
Harold
6
Vous voudrez peut-être ajouter $ date-> modify ('dernier jour de ce mois') -> setTime (23,59,59); si vous souhaitez utiliser ce dateTime pour comparer où le temps compte. (Cela vous donne la dernière seconde du mois)
omgitsdrobinoha
5
Cela fonctionne:$date = new DateTime('last day of 2020-2');
4
@John tu as tort. le dernier jour est calculé en utilisant l'objet $ date et non la date système. Essayez-le en changeant la première ligne avec ceci:$date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
Hannoun Yassir
5
Si vous deviez penser ou au moins essayer ce que je vous ai demandé de faire, vous verriez que ce mois signifie la valeur du mois dans l'objet DateTime et non la date du système. Si vous ne pouvez pas taper / exécuter du code php, cela pourrait aider: sandbox.onlinephpfunctions.com/code/…
Hannoun Yassir
76

Il y a aussi la fonction PHP intégrée cal_days_in_month () ?

"Cette fonction renvoie le nombre de jours du mois de l'année pour le calendrier spécifié." http://php.net/manual/en/function.cal-days-in-month .

echo cal_days_in_month(CAL_GREGORIAN, 11, 2009); 
// = 30
MPV
la source
2
Cette réponse est beaucoup plus simple et appropriée que l'utilisation de strtoTime. Je ne vois aucun inconvénient. Au sommet, vous allez.
Tomas Zubiri
Cela aurait dû être la réponse acceptée.
sieppl
24

Cela devrait fonctionner:

$week_start = strtotime('last Sunday', time());
$week_end = strtotime('next Sunday', time());

$month_start = strtotime('first day of this month', time());
$month_end = strtotime('last day of this month', time());

$year_start = strtotime('first day of January', time());
$year_end = strtotime('last day of December', time());

echo date('D, M jS Y', $week_start).'<br/>';
echo date('D, M jS Y', $week_end).'<br/>';

echo date('D, M jS Y', $month_start).'<br/>';
echo date('D, M jS Y', $month_end).'<br/>';

echo date('D, M jS Y', $year_start).'<br/>';
echo date('D, M jS Y', $year_end).'<br/>';
kaleazy
la source
18

Quel est le problème - Le plus élégant pour moi est d'utiliser DateTime

Je me demande je ne vois pas DateTime::createFromFormat, one-liner

$lastDay = \DateTime::createFromFormat("Y-m-d", "2009-11-23")->format("Y-m-t");
John Smith
la source
2
Je suis d'accord. Cette solution (classe DateTime) est bien meilleure que l'utilisation des anciennes fonctions datetime.
schellingerht
17

Vous pouvez créer une date pour le premier du mois suivant, puis utiliser strtotime("-1 day", $firstOfNextMonth)

nikc.org
la source
une méthode alternative utilisant la même approche consiste à donner à mktime le 0ème jour du mois suivantmktime(0, 0, 0, $month+1, 0, $year);
George
Quant à moi, l'utilisation de strtotime()et mktime()est découragée bec. de bogues connus comme la détermination de la date en bordure des mois et les calculs des années bissextiles. Étant donné que DateTimeest disponible, vous devez utiliser cette classe pour éviter tout problème à l'avenir. Comme je l'ai dit à plusieurs reprises avant moi, ces deux fonctions strtotime()et mktime()échoueront après 2038. C'est pourquoi j'ai rétrogradé ...
Paul T. Rawkeen
@ PaulT.Rawkeen Cette réponse a plus de 4 ans. Comme pour tout ce qui se trouve sur Internet, l'âge devrait être un facteur lors de l'évaluation de la pertinence et de l'utilité. De plus, à mon humble avis, le temps de moitié pour tout ce qui concerne la technologie est particulièrement court.
nikc.org
@ nikc.org Je suis d'accord, en particulier en ce qui concerne la durée de vie de toutes les solutions techniques et les moyens de résoudre les problèmes. Dans ce cas particulier, la réponse a relativement bon nombre de votes positifs et probablement, quelqu'un ( programmeur junior ) considérera cette réponse comme une solution acceptable. il est court et élégant :) et il obtiendra probablement le résultat escompté, mais avec le temps, cette façon de résoudre ce genre de problèmes devient délicate et nous devons avertir de tels faits lorsque cela est possible. Cordialement .
Paul T. Rawkeen
16

Essayez ceci, si vous utilisez PHP 5.3+,

$a_date = "2009-11-23";
$date = new DateTime($a_date);
$date->modify('last day of this month');
echo $date->format('Y-m-d');

Pour trouver la date du mois prochain, modifiez comme suit,

 $date->modify('last day of 1 month');
 echo $date->format('Y-m-d');

etc..

Mohammed Safeer
la source
11

Votre solution est là ..

$lastday = date('t',strtotime('today'));
Vineet Kadkol
la source
1
cela donne 31pour Septemberlequel, comme vous le savez, ce n'est pas correct.
Iliyass Hamza
10

Vous pouvez trouver le dernier jour du mois de plusieurs façons. Mais vous pouvez simplement le faire en utilisant la fonction PHP strtotime () et date () . J'imagine que votre code final ressemblerait à ceci:

$a_date = "2009-11-23";
echo date('Y-m-t',strtotime($a_date));

Démo en direct

Mais si vous utilisez PHP> = 5.2, je vous suggère fortement d'utiliser le nouvel objet DateTime. Par exemple comme ci-dessous:

$a_date = "2009-11-23";
$date = new DateTime($a_date);
$date->modify('last day of this month');
echo $date->format('Y-m-d');

Démo en direct

En outre, vous pouvez résoudre ce problème en utilisant votre propre fonction comme ci-dessous:

/**
 * Last date of a month of a year
 *
 * @param[in] $date - Integer. Default = Current Month
 *
 * @return Last date of the month and year in yyyy-mm-dd format
 */
function last_day_of_the_month($date = '')
{
    $month  = date('m', strtotime($date));
    $year   = date('Y', strtotime($date));
    $result = strtotime("{$year}-{$month}-01");
    $result = strtotime('-1 second', strtotime('+1 month', $result));

    return date('Y-m-d', $result);
}

$a_date = "2009-11-23";
echo last_day_of_the_month($a_date);
Faisal
la source
Merci pour votre fonction, cela fonctionne comme je
m'y
7

Si vous utilisez l' extension Carbon API pour PHP DateTime, vous pouvez obtenir le dernier jour du mois avec:

$date = Carbon::now();
$date->addMonth();
$date->day = 0;
echo $date->toDateString(); // use toDateTimeString() to get date and time 
eaykin
la source
En fait, si vous définissez le jour sur -1, il obtiendra le dernier sauf un. Vous devez donc définir le jour sur 0 pour obtenir le dernier jour. $date->day = 0;
Giovanne Afonso
merci @GiovanneAfonso c'est correct. J'ai mis le jour à 0 et testé la réponse.
eaykin
1
Si vous utilisez Carbon, une approche à une ligne consiste à utiliser: Carbon :: Now () -> endOfMonth (). Cependant, endOfMonth () est un modificateur, utilisez donc "clone" si vous avez une variable existante contenant une date Carbon (ou la date sera modifiée).
Charlie Dalsass
4

Vous pouvez également l'utiliser avec datetime

$date = new \DateTime();
$nbrDay = $date->format('t');
$lastDay = $date->format('Y-m-t');
Ajouve
la source
4
$date1 = $year.'-'.$month; 
$d = date_create_from_format('Y-m',$date1); 
$last_day = date_format($d, 't');
kayla
la source
2

Utiliser Zend_Date c'est assez simple:

$date->setDay($date->get(Zend_Date::MONTH_DAYS));
mkerstner
la source
2

Si vous avez un mois, obtenez la dernière date du mois,

public function getLastDateOfMonth($month)
    {
        $date = date('Y').'-'.$month.'-01';  //make date of month 
        return date('t', strtotime($date)); 
    }

$this->getLastDateOfMonth(01); //31
Kaushik shrimali
la source
1

Voici une fonction complète:

public function get_number_of_days_in_month($month, $year) {
    // Using first day of the month, it doesn't really matter
    $date = $year."-".$month."-1";
    return date("t", strtotime($date));
}

Cela donnerait la sortie suivante:

echo get_number_of_days_in_month(2,2014);

Sortie: 28

Firze
la source
1

Il existe des moyens d'obtenir le dernier jour du mois.

//to get last day of current month
echo date("t", strtotime('now'));

//to get last day from specific date
$date = "2014-07-24";
echo date("t", strtotime($date));

//to get last day from specific date by calendar
$date = "2014-07-24";
$dateArr=explode('-',$date);
echo cal_days_in_month(CAL_GREGORIAN, $dateArr[1], $dateArr[0]); 
vigne
la source
1

Une autre façon d'utiliser mktime et non date ('t'):

$dateStart= date("Y-m-d", mktime(0, 0, 0, 10, 1, 2016)); //2016-10-01
$dateEnd = date("Y-m-d", mktime(0, 0, 0, 11, 0, 2016)); //This will return the last day of october, 2016-10-31 :)

Donc, de cette façon, il calcule soit 31,30 soit 29

Robin Rumeau
la source
1

Je suis en retard, mais il existe plusieurs façons simples de procéder, comme mentionné:

$days = date("t");
$days = cal_days_in_month(CAL_GREGORIAN, date('m'), date('Y'));
$days = date("j",mktime (date("H"),date("i"),date("s"),(date("n")+1),0,date("Y")));

Utiliser mktime () est mon choix pour un contrôle complet sur tous les aspects du temps ... IE

echo "<br> ".date("Y-n-j",mktime (date("H"),date("i"),date("s"),(11+1),0,2009));

Mettre le jour à 0 et déplacer votre mois vers le haut 1 vous donnera le dernier jour du mois précédent. 0 et les nombres négatifs ont l'effet similaire dans les différents arguments. PHP: mktime - Manuel

Comme certains l'ont dit, le strtotime n'est pas la voie la plus solide et peu, voire aucun, est aussi facilement polyvalent.

JSG
la source
1

J'utilise strtotime avec cal_days_in_month comme suit:

$date_at_last_of_month=date('Y-m-d', strtotime('2020-4-1
+'.(cal_days_in_month(CAL_GREGORIAN,4,2020)-1).' day'));
user2448808
la source
0

Extension d'API Carbon pour PHP DateTime

Carbon::parse("2009-11-23")->lastOfMonth()->day;

ou

Carbon::createFromDate(2009, 11, 23)->lastOfMonth()->day;

reviendra

30
josef
la source
-1
function first_last_day($string, $first_last, $format) {
    $result = strtotime($string);
    $year = date('Y',$result);
    $month = date('m',$result);
    $result = strtotime("{$year}-{$month}-01");
    if ($first_last == 'last'){$result = strtotime('-1 second', strtotime('+1 month', $result)); }
    if ($format == 'unix'){return $result; }
    if ($format == 'standard'){return date('Y-m-d', $result); }
}

http://zkinformer.com/?p=134

Kevin
la source
-2

C'est une façon beaucoup plus élégante d'obtenir la fin du mois:

  $thedate = Date('m/d/Y'); 
  $lastDayOfMOnth = date('d', mktime(0,0,0, date('m', strtotime($thedate))+1, 0, date('Y', strtotime($thedate)))); 
Louis Sterio
la source
-3

Vous pouvez utiliser "t " dans la fonction date pour obtenir le nombre de jours dans un mois particulier.

Le code ressemblera à ceci:

function lastDateOfMonth($Month, $Year=-1) {
    if ($Year < 0) $Year = 0+date("Y");
    $aMonth         = mktime(0, 0, 0, $Month, 1, $Year);
    $NumOfDay       = 0+date("t", $aMonth);
    $LastDayOfMonth = mktime(0, 0, 0, $Month, $NumOfDay, $Year);
    return $LastDayOfMonth;
}

for($Month = 1; $Month <= 12; $Month++)
    echo date("Y-n-j", lastDateOfMonth($Month))."\n";

Le code s'explique de lui-même. Alors j'espère que ça aide.

NawaMan
la source