Wie finde ich den letzten Tag des Monats ab Datum?


382

Wie kann ich den letzten Tag des Monats in PHP erhalten?

Gegeben:

$a_date = "2009-11-23"

Ich möchte 2009-11-30; und gegeben

$a_date = "2009-12-23"

Ich möchte 2009-12-31.

Antworten:


805

tGibt die Anzahl der Tage im Monat eines bestimmten Datums zurück (siehe Dokumentation fürdate ):

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

99
Dies wird nach dem Jahr 2038 fehlschlagen. Daher sollte anstelle von strtotime die DateTime-Funktion verwendet werden. Der folgende Code funktioniert ohne das Problem des Jahres 2038: $ d = new DateTime ('2009-11-23'); echo $ d-> format ('Ymt');
Mugunth

74
@Mugunth Wenn Sie mit Daten arbeiten, die 24 Jahre in der Zukunft liegen, können Probleme vor 2038 auftreten. Die Server werden jedoch bereits auf eine 64-Bit-Architektur umgestellt, sodass wir das Problem in etwa 292 Milliarden Jahren beheben können.
Keine

1
im Verfahren -> $ date1 = $ year .'- '. $ month; $ d = date_create_from_format ('Y-m', $ date1); $ last_day = date_format ($ d, 't');
Kayla

11
Mit DateTimekönnen Sie so etwas tun:(new DateTime('2009-11-23'))->modify('last day of')
Victor

Wenn Sie Carbon PHP verwenden, können Sie daysInMonth getter
astroanu

119

Der Code mit strtotime () schlägt nach dem Jahr 2038 fehl. (Wie in der ersten Antwort in diesem Thread angegeben) Versuchen Sie beispielsweise Folgendes:

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

Es wird eine Antwort geben als: 1970-01-31

Daher sollte anstelle von strtotime die DateTime-Funktion verwendet werden. Der folgende Code funktioniert ohne das Problem des Jahres 2038:

$d = new DateTime( '2040-11-23' ); 
echo $d->format( 'Y-m-t' );

17
Ich werde 71 Jahre alt und bis dahin im Ruhestand sein, also kein Problem für mich! j / k Aber ernsthafte Leute - beachten Sie diese Warnung!
Volomike

17
Dies setzt voraus, dass Sie eine 32-Bit-Version von PHP ausführen.
Keine

Warum wird diese alarmierende Tatsache über strtotime nicht in der PHP- Dokumentation php.net/manual/de/function.strtotime.php erwähnt ?
Adam

1
@Adam Es ist jetzt nicht sicher, ob es war, als Sie überprüft haben. php.net/manual/de/…
Mave

1
Ab 2018 strtotimegibt mir der Code dieses Ergebnis: 2040-11-30
Jee

104

Ich weiß, dass dies etwas spät ist, aber ich denke, es gibt eine elegantere Möglichkeit, dies PHP 5.3+mithilfe der DateTime- Klasse zu tun :

$date = new DateTime('now');
$date->modify('last day of this month');
echo $date->format('Y-m-d');

20
In einer Zeile: $ date = new DateTime ('letzter Tag dieses Monats');
Harold

6
Möglicherweise möchten Sie $ date-> modify ('letzter Tag dieses Monats') -> setTime (23,59,59) hinzufügen. Wenn Sie diese dateTime zum Vergleich verwenden möchten, wenn es auf die Zeit ankommt. (Dies gibt Ihnen die letzte Sekunde des Monats)
Omgitsdrobinoha

5
Dies funktioniert:$date = new DateTime('last day of 2020-2');

4
@ John du liegst falsch. Der letzte Tag wird anhand des $ date-Objekts und nicht anhand des Systemdatums berechnet. Versuchen Sie es, indem Sie die erste Zeile folgendermaßen ändern:$date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
Hannoun Yassir

5
Wenn Sie überlegen oder zumindest versuchen würden, was ich Sie gebeten habe, würden Sie sehen, dass dieser Monat den Wert des Monats im DateTime-Objekt und nicht das Datum des Systems bedeutet. Wenn Sie keinen PHP-Code eingeben
Hannoun Yassir

76

Gibt es auch die eingebaute PHP-Funktion cal_days_in_month () ?

"Diese Funktion gibt die Anzahl der Tage im Monat des Jahres für den angegebenen Kalender zurück." http://php.net/manual/en/function.cal-days-in-month .

echo cal_days_in_month(CAL_GREGORIAN, 11, 2009); 
// = 30

2
Diese Antwort ist viel einfacher und angemessener als die Verwendung von strtoTime. Ich sehe keine Nachteile. Nach oben gehst du.
Tomas Zubiri

Dies sollte die akzeptierte Antwort gewesen sein.
Sieppl

24

Das sollte funktionieren:

$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

Was ist los - Das eleganteste für mich ist die Verwendung DateTime

Ich frage mich, ich sehe nicht DateTime::createFromFormat, Einzeiler

$lastDay = \DateTime::createFromFormat("Y-m-d", "2009-11-23")->format("Y-m-t");

2
Genau. Diese Lösung (DateTime-Klasse) ist viel besser als die Verwendung der alten datetime-Funktionen.
schellingerht

17

Sie können ein Datum für den ersten des nächsten Monats erstellen und dann verwenden strtotime("-1 day", $firstOfNextMonth)


Eine alternative Methode, die denselben Ansatz verwendet, besteht darin, mktime den 0. Tag des nächsten Monats zu gebenmktime(0, 0, 0, $month+1, 0, $year);
George

Was mich betrifft, wird von der Verwendung von strtotime()und mktime()abgeraten, weil. von bekannten Fehlern wie Datumsbestimmung am Rande der Monate und Schaltjahrkalakulationen. Da DateTimeverfügbar ist, sollten Sie diese Klasse verwenden, um zukünftige Probleme zu vermeiden. Wie schon oft vor mir gesagt, funktionieren beide strtotime()und mktime()werden nach 2038 scheitern. Deshalb habe ich ...
Paul T. Rawkeen

@ PaulT.Rawkeen Diese Antwort ist älter als 4 Jahre. Wie bei allem im Internet sollte das Alter ein Faktor sein, um Relevanz und Nützlichkeit zu messen. Darüber hinaus, IMHO, ist die Halbierungszeit für alles, was mit Technologie zu tun hat, besonders kurz.
Nikc.org

@ nikc.org Ich stimme zu, insbesondere in Bezug auf die Lebenszeit für alle technischen Lösungen und Möglichkeiten zur Problemlösung. In diesem speziellen Fall hat die Antwort eine relativ gute Anzahl von Upvotes, und wahrscheinlich wird jemand ( Junior-Programmierer ) diese Antwort als akzeptable Lösung betrachten, da. es ist kurz und elegant :) und er wird wahrscheinlich das erwartete Ergebnis erzielen , aber mit der Zeit wird diese Art der Lösung solcher Probleme schwierig und wir sollten vor solchen Tatsachen warnen, wenn es möglich ist. Herzliche Grüße .
Paul T. Rawkeen

16

Versuchen Sie dies, wenn Sie PHP 5.3+ verwenden.

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

Ändern Sie Folgendes, um das letzte Datum des nächsten Monats zu ermitteln:

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

und so weiter..


11

Ihre Lösung ist da ..

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

1
das gibt 31 für Septemberdie, wie Sie wissen, das nicht richtig ist.
Iliyass Hamza

10

Sie können den letzten Tag des Monats auf verschiedene Arten finden. Aber einfach können Sie dies mit der PHP-Funktion strtotime () und date () tun. Ich würde mir vorstellen, dass Ihr endgültiger Code ungefähr so aussehen würde:

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

Live-Demo

Wenn Sie jedoch PHP> = 5.2 verwenden, empfehle ich dringend, das neue DateTime-Objekt zu verwenden. Zum Beispiel wie unten:

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

Live-Demo

Sie können dies auch mit Ihrer eigenen Funktion wie folgt lösen:

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

Vielen Dank für Ihre Funktion, es funktioniert wie ich erwartet hatte :)
Mankeomorakort

7

Wenn Sie die Carbon API-Erweiterung für PHP DateTime verwenden, können Sie den letzten Tag des Monats abrufen mit:

$date = Carbon::now();
$date->addMonth();
$date->day = 0;
echo $date->toDateString(); // use toDateTimeString() to get date and time 

Wenn Sie den Tag auf -1 setzen, wird der vorletzte Tag angezeigt. Sie müssen also den Tag auf 0 setzen, um den letzten Tag zu erhalten. $date->day = 0;
Giovanne Afonso

danke @GiovanneAfonso das ist richtig. Ich habe den Tag auf 0 gesetzt und die Antwort getestet.
eaykin

1
Wenn Sie Carbon verwenden, verwenden Sie einen Einzeiler-Ansatz: Carbon :: Now () -> endOfMonth (). EndOfMonth () ist jedoch ein Modifikator. Verwenden Sie daher "clone", wenn eine Variable mit einem Carbon-Datum vorhanden ist (oder das Datum geändert wird).
Charlie Dalsass

4

Sie können es auch mit datetime verwenden

$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

Mit Zend_Date ist es ziemlich einfach:

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

2

Wenn Sie einen Monat Zeit haben, erhalten Sie das letzte Datum des Monats.

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

$this->getLastDateOfMonth(01); //31

1

Hier ist eine vollständige Funktion:

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

Dies würde Folgendes ausgeben:

echo get_number_of_days_in_month(2,2014);

Ausgabe: 28


1

Es gibt Möglichkeiten, den letzten Tag des Monats zu erreichen.

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

Ich bin spät dran, aber es gibt eine Handvoll einfacher Möglichkeiten, dies zu tun, wie erwähnt:

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

Mit mktime () habe ich die vollständige Kontrolle über alle Aspekte der Zeit ... IE

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

Wenn Sie den Tag auf 0 setzen und Ihren Monat um 1 verschieben, erhalten Sie den letzten Tag des Vormonats. 0 und negative Zahlen haben in den verschiedenen Argumenten den gleichen Effekt. PHP: mktime - Handbuch

Wie einige gesagt haben, ist strtotime nicht der beste Weg und wenig, wenn keiner so einfach vielseitig ist.


1

Ich verwende strtotime mit cal_days_in_month wie folgt:

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


0

Eine andere Möglichkeit, mktime und nicht date ('t') zu verwenden:

$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 :)

Auf diese Weise wird entweder berechnet, ob es 31,30 oder 29 ist


0

Carbon API Erweiterung für PHP DateTime

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

oder

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

wird zurückkehren

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

Dies ist ein viel eleganterer Weg, um das Ende des Monats zu erreichen:

  $thedate = Date('m/d/Y'); 
  $lastDayOfMOnth = date('d', mktime(0,0,0, date('m', strtotime($thedate))+1, 0, date('Y', strtotime($thedate)))); 

-3

Sie können verwenden "t " verwenden, um die Anzahl der Tage in einem bestimmten Monat abzurufen.

Der Code wird ungefähr so ​​aussehen:

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

Der Code ist selbsterklärend. Hoffe es hilft.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.