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.

Mithun Sreedharan
quelle

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));
Dominic Rodger
quelle
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' );
Mugunth
quelle
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');
Hannoun Yassir
quelle
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
MPV
quelle
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/>';
kaleazy
quelle
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");
John Smith
quelle
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)

nikc.org
quelle
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..

Mohammed Safeer
quelle
11

Ihre Lösung ist da ..

$lastday = date('t',strtotime('today'));
Vineet Kadkol
quelle
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);
Faisal
quelle
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 
eaykin
quelle
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');
Ajouve
quelle
4
$date1 = $year.'-'.$month; 
$d = date_create_from_format('Y-m',$date1); 
$last_day = date_format($d, 't');
Kayla
quelle
2

Mit Zend_Date ist es ziemlich einfach:

$date->setDay($date->get(Zend_Date::MONTH_DAYS));
mkerstner
quelle
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
Kaushik Shrimali
quelle
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

Firze
quelle
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]); 
Weinstock
quelle
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.

JSG
quelle
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'));
user2448808
quelle
0

Ich habe es in meine Datums- / Uhrzeit-Hilfsklasse hier https://github.com/normandqq/Date-Time-Helper eingewickelt mit $dateLastDay = Model_DTHpr::getLastDayOfTheMonth();

Und es ist geschafft

normannisch
quelle
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

Robin Rumeau
quelle
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
Josef
quelle
-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
quelle
-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)))); 
Louis Sterio
quelle
-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.

NawaMan
quelle