2016-06-13 8 views
1

Ich habe den folgenden Code, der das Datum analysiert bekommt, subtrahiert 1 Monat. Das funktioniert perfekt.erhalten letztes Datum im Monat Fehler

$date = '22-05-2016'; 
print(date("Y-m-d 23:59:59", strtotime($date.' -1 months'))); 
// outputs 2016-04-22 23:59:59 

Es gibt Zeiten, wo ich das Datum zum Monatsende erzwingen muss. Dazu benutze ich Y-m-t anstelle von Y-m-d, was perfekt funktioniert.

$date = '22-05-2016'; 
print(date("Y-m-t 23:59:59", strtotime($date.' -1 months'))); 
// outputs 2016-04-30 23:59:59 


Das Problem kommt, wenn das Datum, die tatsächlich analysiert wird der letzte Tag des Monats ist. Es wird dann bis zum Ende des nächsten Monats umgedreht.

$date = '31-05-2016'; 
print(date("Y-m-t 23:59:59", strtotime($date.' -1 months'))); 

tatsächliche Output 2016.05.31 23.59.59 (nicht entfernt 1 Monat)

gewünschte Ausgabe 2016-04-30 23:59:59

EDIT: Fiddle Beispiel http://ideone.com/0fqlor

+1

"Monat Mathe" ist nie zuverlässig, weil Monate sind unterschiedliche Größe: 28,29,30,31. Wenn Sie am 1. März sind, sollte ein Monat subtrahiert werden. 1. Februar? minus 29 Tage, weil es ein Schaltjahr ist und Feb vor März kommt? minus 31 Tage, weil März 31 Tage hat? Was, wenn du am 31. März bist, dann gibt es keinen 31. Februar - das würde dem 2./3. März entsprechen. strtotime hat keine Ahnung, was deine Absichten sind, also tut es das Beste, was du kannst. Sie müssen die Logik bereitstellen, wenn das Ergebnis nicht eindeutig ist. –

+0

Welche Version von PHP verwenden Sie? Ich kann Ihr Problem mit PHP 7.0.3 nicht reproduzieren. '$ date = '31 -05-2016 ';' 'drucken (Datum (" Ymd 23:59:59 ", strtotime ($ date.' -1 Monate ')));' outputs _2016-05-01 23 : 59: 59_ – GaijinJim

+0

Wollen Sie den letzten Tag des Monats bestimmen, wenn Sie "Ende des Monats" sagen? – Ray

Antwort

2

Versuchen:

$date = '31-05-2016'; 
print(date("Y-m-d 23:59:59", strtotime($date.' last day of last month'))); 

und graben sich in strtotime Möglichkeiten;)

Werfen Sie einen Blick hier: http://php.net/manual/en/datetime.formats.relative.php

Last Hinweis: -1 month bekommt nur 30 Tage in der Zeit zurück. Deshalb wird es nicht immer funktionieren. Irgendeine Art von PHP Zeug, denke ich;)

+0

Ich habe ein seltsames Ergebnis mit '$ date = '31 -01-2016'' bekommen. Es gibt '2015-12-30 23: 59: 59' und nicht' 31' aus. Ich bin mir nicht sicher warum, ist das für irgendjemand anderen reproduzierbar? – Scott

+0

U kann '-t' nehmen, um sicher zu gehen, aber ich werde mir das ansehen. – JustOnUnderMillions

+1

Ich habe es aktualisiert. Funktioniert jetzt. – JustOnUnderMillions

0

strtotime ist dein Freund. Der letzte Tag eines beliebigen "gegebenen" Monats kann mit der verbalen Zeichenkette last day of May 2015 abgerufen werden - also, um eine einfache Eingabe zu ermöglichen (Sie haben einen Datumswähler und keine Monatsauswahl), konvertieren Sie das ausgewählte Datum zuerst in seinen Monatsausdruck:

date_default_timezone_set('Europe/London'); 
$to = '31-05-2016'; 
$month = date("M Y", strtotime($to)); 
$strtotime_expression = "last day of " . $month; 
echo $strtotime_expression.": <br />"; 
print(date("Y-m-t 23:59:59", strtotime($strtotime_expression))); 

http://ideone.com/YvjVeP

Verwandte Themen