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.

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));

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' );

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');

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

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/>';

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");

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)


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..


11

Votre solution est là ..

$lastday = date('t',strtotime('today'));

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);

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 

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');

4
$date1 = $year.'-'.$month; 
$d = date_create_from_format('Y-m',$date1); 
$last_day = date_format($d, 't');

2

Utiliser Zend_Date c'est assez simple:

$date->setDay($date->get(Zend_Date::MONTH_DAYS));

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

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


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]); 

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


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.


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'));


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

-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


-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)))); 

-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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.