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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top