Domanda
Stava funzionando bene ieri senza modifiche al codice.
echo date("M", strtotime("-3 month", time()) );
echo date("M", strtotime("-2 month", time()) );
echo date("M", strtotime("-1 month", time()) );
echo date("M", time());
L'output che stava producendo ieri era come ti aspetteresti, ad esempio aprile, maggio, giugno, luglio
Oggi fa eco a maggio maggio luglio luglio
Qualche idea?
Grazie in anticipo.
Soluzione
Potrebbe essere correlato al bug # 44073
Potresti provare con qualcosa del genere:
echo date("M", strtotime("-3 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", strtotime("-2 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", strtotime("-1 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", time()) . "\n";
(Soluzione trovata nella sezione commenti di strtotime
; collegamento diretto )
E l'output:
Apr
May
Jun
Jul
Tipo di " barare " con il formato della data, il nome del mese e tutto il resto ...
Altri suggerimenti
Gorden ha identificato correttamente il problema, ma volevo dare un'altra soluzione utile e non tecnica. Usa " primo giorno di " o " ultimo giorno di " nel tuo tempo libero. Ad esempio, questi esempi seguenti risolvono il problema il 31 di un mese:
// Today is May 31st
//All the following return 2012-04-30
echo date('Y-m-d', strtotime("last day of -1 month"));
echo date('Y-m-d', strtotime("last day of last month"));
echo date_create("last day of -1 month")->format('Y-m-d');
// All the following return 2012-04-01
echo date('Y-m-d', strtotime("first day of -1 month"));
echo date('Y-m-d', strtotime("first day of last month"));
echo date_create("first day of -1 month")->format('Y-m-d');
Prova questo invece di strtotime
:
mktime(0, (date("n") - 3 + 12) % 12, 1)
L'idea è di prendere il numero del mese corrente ( data (" n ")
), sottrarre il numero di mesi che vuoi (qui -3
) , aggiungici 12 e poi ottieni il modulo 12.
Questo è un comportamento noto e previsto. La ragione di ciò è che un mese è una data relativa senza durata fissa. Da http: // www. gnu.org/software/tar/manual/html_node/Relative-items-in-date-strings.html#SEC120
L'unità di spostamento del tempo può essere selezionata dalla stringa & # 8216; anno & # 8217; o & # 8216; mese & # 8217; per trasferirsi per interi anni o mesi. Queste sono unità sfocate, poiché anni e mesi non hanno tutti la stessa durata. Le unità più precise sono & # 8216; quindici giorni & # 8217; che vale 14 giorni, & # 8216; settimana & # 8217; vale 7 giorni, & # 8216; giorno & # 8217; vale 24 ore, & # 8216; ora & # 8217; vale 60 minuti, & # 8216; minuto & # 8217; o & # 8216; min & # 8217; vale 60 secondi e & # 8216; secondo & # 8217; o & # 8216; sec & # 8217; vale un secondo. An & # 8216; s & # 8217; il suffisso su queste unità è accettato e ignorato.
Di conseguenza (enfasi sulla mia)
Il fuzz in unità può causare problemi con gli articoli relativi. Ad esempio, & # 8216; 2003-07-31 -1 mese & # 8217; potrebbe valutare fino al 2003-07-01, perché 2003-06-31 non è una data valida. Per determinare il mese precedente in modo più affidabile, puoi chiedere il mese prima del 15 del mese corrente . Ad esempio:
$ date -R Thu, 31 Jul 2003 13:02:39 -0700 $ date --date='-1 month' +'Last month was %B?' Last month was July? $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!' Last month was June!
Quanto sopra potrebbe essere espresso in PHP come
echo date('M', strtotime(date('Y-m-') . '15 -1 month'));
Vedi anche i seguenti commenti http://bugs.php.net/bug.php ? id = 22486
Da PHP 5.3 (Rif .: https://bugs.php.net/bug. php? id = 44073 ) e versioni successive puoi fare:
" primo giorno di +1 mese
" o " primo giorno del mese successivo
" o anche " ultimo giorno del mese successivo
"
Esempio:
$date = '2015-12-31';
echo date("Y-m-d", strtotime($date ."first day of previous month"));
Produrrà: 2015-11-01
Questo non calcola i giorni su una base temporale di +30 giorni.
un modo semplice potrebbe essere quello di scriverlo in questo modo
data eco (" M " ;, strtotime (" quest'anno +3 mesi "));
o
data eco (" M " ;, strtotime (" questo mese -3 mesi "));
dipende da cosa lo usi per ..