2011-11-11 11 views
5

Mi aspettavo questo funzionale per tornare 6/30/2005 invece di 7/1/2005.php: strtotime ("31/12/2004 +6 mese")); non tornare l'ultimo giorno del mese di giugno

print date("m/d/Y", strtotime("12/31/2004 +6 month")); 

Allo stesso modo, i rendimenti print date("m/d/Y", strtotime("1/31/2011 +1 month"))03/03/2011 mentre vorrebbe che tornare 2/28/2011.

Qualcuno sa se c'è un modo dritto in avanti per mostrare l'ultimo giorno del mese aggiunto?

+0

'strtotime' funziona con date in stile europeo, se non ricordo male. prova '31/1/2011' ecc. –

risposta

6

ne dici di questo?

echo date("m/d/Y", strtotime("last day of 12/31/2004 + 6 month")); // 6/30/2005 
echo date("m/d/Y", strtotime("last day of 1/31/2011 + 1 month")); // 2/28/2011 

Demo

Edit: Per il vostro riferimento, ecco un link alla documentation for relative times.

0

Un modo semplice è quello di andare effettivamente un mese in anticipo rispetto al giorno desiderato e quindi rendere il valore giorno zero. Inoltre, mktime() potrebbe essere più facile

$mymonth = 2; // I want the last day of February 
echo date('m/d/Y', mktime(0,0,0,$mymonth+1,0,2011)); 

Ciò dovrebbe restituire 2011/02/28.

2

come strtotime continuano al mese prossimo se non c'è giorni enoghe quel mese, è possibile eseguire il sei mesi e verificare se la sua fine sulla data di inizio

$date2 = date("Y-m-d", strtotime("{$date} +6 months")); 
    $date3 = date("Y-m-d", strtotime("{$date2} -6 months")); 
    if($date3 != $date) 
    { 
    $date2 = date("Y-m-t", strtotime("{$date2} -1 months")); 
    } 

(o nel tuo caso " m/t/Y ")

0

strtotime fa il meglio che può con informazioni contrastanti. Dire

1/31/2011 +1month 

significherebbe avanzare alla

2/31/2011 

ma febbraio ha solo 28 (a volte 29) giorni. Il 2011 non è un anno bisestile, quindi il "31 di febbraio" viene normalizzato a "3 marzo".

Lo stesso vale per '12/31/2004 + 6 mesi'. Questo ti porta al 31 giugno 2005. Ma June ha solo 30 giorni, quindi la data è normalizzata al 1 ° luglio.

Problemi correlati