Ottenere la data del mese scorso in php


86

Voglio ricevere la data del mese scorso. Ho scritto questo:

$prevmonth = date('M Y');

Che mi dà il mese / anno corrente. Non posso dire se devo usare strtotime, mktime. Qualcosa sul timestamp? Devo aggiungere qualcosa in seguito per reimpostare in modo che la data non sia impostata sul mese scorso in tutto per tutti i timestamp sul mio sito? Sto cercando di fare RTM ma è difficile per me capirlo.

Risposte:


212

È semplice ottenere la data del mese scorso

echo date("Y-n-j", strtotime("first day of previous month"));
echo date("Y-n-j", strtotime("last day of previous month"));

al 3 novembre torna

2014-10-1
2014-10-31

7
Questo non è abbastanza buono e può causare errori nel codice: $time = strtotime('2011-03-30 01:01:01'); echo date('r', strtotime('-1 month', $time));questo tornerà mercoledì, 02 mar 2011 01:01:01 - non febbraio! Usa strtotime('first day of previous month')invece
Ostin

@OzzyCzech Ritorna l'1 e il 31 ottobre quando lo esegui il 3 marzo?
The Unknown Dev

$ data_day_str = strtotime ("mese precedente", strtotime ('30/03/2011 01:01:01')); Otterrai febbraio del 2011.
Rodrigo Serzedello

33
echo strtotime("-1 month");

Questo produrrà esattamente il timestamp per il mese scorso. Non è necessario ripristinare nulla in seguito. Se lo desideri in un formato inglese, puoi utilizzare date () per formattare il timestamp, ad esempio:

echo date("Y-m-d H:i:s",strtotime("-1 month"));

12
Oggi è il 31 ottobre 2012. date ("Ymd", strtotime ("- 1 month")); Restituisce 01/10/2012. :(
Todd

7
@toddsler corretto. -1 mese equivale a scrivere -30 giorni che in determinate date durante l'anno salteranno 1 mese o rimarranno nello stesso mese, quindi fai attenzione con questo metodo.
silkfire

NON USARE QUESTA SOLUZIONE! I commenti precedenti sono corretti, si avranno errori che verranno attivati ​​solo il 31 ° giorno del mese (o il 29,30,31 marzo)
Teenage

19
$prevmonth = date('M Y', strtotime("last month"));

3
Questo è lo stesso di date ('M Y', strtotime ("- 1 mese")), se fai qualcosa come date ('M Y', strtotime ("2017-07-31 last month")) tornerà 01/07/2017, quindi fai attenzione! date ('M Y', strtotime ('2017-07-31 primo giorno del mese precedente')) ti darebbe quello che vuoi
Shadoweb

12

Le risposte errate sono:

$lastMonth = date('M Y', strtotime("-1 month"));
$lastDate = date('Y-m', strtotime('last month'));

Il motivo è se il mese corrente è di 30+ giorni ma il mese precedente è 29 e meno $ lastMonth sarà lo stesso del mese corrente.

per esempio

If $currentMonth = '30/03/2016';
echo $lastMonth = date('m-Y', strtotime("-1 month")); => 03-2016
echo $lastDate = date('Y-m', strtotime('last month')); => 2016-03

La risposta corretta sarà:

echo date("m-Y", strtotime("first day of previous month")); => 02-2016
echo sprintf("%02d",date("m")-1) . date("-Y"); => 02-2016
echo date("m-Y",mktime(0,0,0,date("m")-1,1,date("Y"))); => 02-2016

1
Vorrei votare se rimuovi echo sprintf ("% 02d", date ("m") - 1). data ("- Y"); => 02-2016. Se siamo a gennaio, risponde al mese 0 di quest'anno, non al 12 dell'anno scorso!
Tama

6

se vuoi ottenere solo il mese precedente, puoi usare come segue

$prevmonth = date('M Y', strtotime('-1 months'));

se vuoi ottenere gli stessi giorni del mese precedente, puoi usare come segue ..

$prevmonth = date('M Y d', strtotime('-1 months'));

se vuoi ottenere l'ultima data del mese precedente, puoi usare come segue ...

$prevmonth = date('M Y t', strtotime('-1 months'));

se vuoi ottenere la prima data del mese precedente, puoi usare come segue ...

$prevmonth = date('M Y 1', strtotime('-1 months'));

3
Stai attento per il 31 del mese! Ti darà il 1 ° del mese corrente! Vedi sopra.
Shadoweb

6
echo date('Y',strtotime("-1 year"));        //last year<br>
echo date('d',strtotime("-1 day"));     //last day<br>
echo date('m',strtotime("-1 month"));       //last month<br>

3
Questa risposta non è corretta quando la data corrente è 2018/03/31. Dettagli anche come questo
Ngoc Nam

4

Ho trovato questo sbagliato quando i mesi precedenti sono più brevi di quelli attuali.

echo date("Y-m-d H:i:s",strtotime("-1 month"));

Prova il 30 marzo e otterrai il 01/03/2012 invece del 02/02 ...

Elaborare una soluzione migliore ...


3
Questa risposta è corretta (-1 mese non funzionerà correttamente in tutti i casi). Per il mese precedente, usa strtotime ('last month').
Mike

1
Il mese scorso o -1 mese restituisce lo stesso valore.
Etienne Dupuis

4
public function getLastMonth() {
    $now = new DateTime();
    $lastMonth = $now->sub(new DateInterval('P1M'));
    return $lastMonth->format('Ym');
}

1
Non funzionerà 2015-10-31in PHP 5.5 e 5.6.11. Otterrai lo 201510stesso comportamento di strtotime('- 1 month).
pmayer

2

Usa questo codice breve per ottenere il mese precedente per una determinata data:

$tgl = '25 january 2012';

$prevmonth = date("M Y",mktime(0,0,0,date("m", strtotime($tgl))-1,1,date("Y", strtotime($tgl))));
echo $prevmonth;

Il risultato è dicembre 2011. Funziona su un mese con un giorno più breve rispetto al mese precedente.


2
$lastMonth = date('M Y', strtotime("-1 month"));
var_dump($lastMonth);
$lastMonth = date('M Y', mktime(0, 0, 0, date('m') - 1, 1, date('Y')));
var_dump($lastMonth);

4
Sebbene il codice stesso possa essere in qualche modo autoesplicativo, è utile ad altri utenti spiegare la tua risposta piuttosto che fornire semplicemente il codice.
Turnerj

1

Puoi usare strtotime, che è ottimo in questo tipo di situazioni:

$timestamp = strtotime('-1 month');
var_dump(date('Y-m', $timestamp));

Ti porterà:

string '2009-11' (length=7)

1
$time = mktime(0, 0, 0, date("m"),date("d")-date("t"), date("Y"));
$lastMonth = date("d-m-Y", $time);

O

$lastMonth = date("m-Y", mktime() - 31*3600*24);

funziona il 30.03.2012


1

Oh, ho capito, per favore ignora a meno che tu non abbia lo stesso problema che ho fatto io, nel qual caso:

$prevmonth = date("M Y",mktime(0,0,0,date("m")-1,1,date("Y")));

1

La migliore soluzione che ho trovato è questa:

function subtracMonth($currentMonth, $monthsToSubtract){
        $finalMonth = $currentMonth;
        for($i=0;$i<$monthsToSubtract;$i++) {
            $finalMonth--;
            if ($finalMonth=='0'){
                $finalMonth = '12';
            }

        }
        return $finalMonth;

    }

Quindi se siamo in 3 (marzo) e vogliamo sottrarre 5 mesi, sarebbe

subtractMonth(3,5);

che darebbe 10 (ottobre). Se si desidera anche l'anno, si potrebbe fare questo:

function subtracMonth($currentMonth, $monthsToSubtract){
    $finalMonth = $currentMonth;
    $totalYearsToSubtract = 0;
    for($i=0;$i<$monthsToSubtract;$i++) {
        $finalMonth--;
        if ($finalMonth=='0'){
            $finalMonth = '12';
            $totalYearsToSubtract++;
        }

    }
    //Get $currentYear
    //Calculate $finalYear = $currentYear - $totalYearsToSubtract 
    //Put resulting $finalMonth and $finalYear into an object as attributes
    //Return the object

}

0

Per me funziona:

Oggi è: 31/03/2012

echo date("Y-m-d", strtotime(date('m', mktime() - 31*3600*24).'/01/'.date('Y').' 00:00:00')); // 2012-02-01
echo  date("Y-m-d", mktime() - 31*3600*24); // 2012-02-29

In funziona solo nel 58,3 (3)% dei casi. Che dire di febbraio, aprile, giugno, settembre e novembre? Non hanno 31 giorni.
Taz

0

Se vuoi ottenere la prima data del mese precedente, puoi usare come segue ... $prevmonth = date('M Y 1', strtotime('-1 months'));cosa? il primo appuntamento sarà sempre 1: D


31 ottobre 2012. Ritorno 01/10/2012
Akira Yamamoto,

0

Questa domanda è piuttosto vecchia ma qui va comunque. Se stai cercando di ottenere solo il mese precedente e il giorno non ha importanza, puoi usare questo:

$date = '2014-01-03';

$dateTime = new DateTime($date);

$lastMonth = $dateTime->modify('-' . $dateTime->format('d') . ' days')->format('F Y');

echo $lastMonth; // 'December 2013'

0

Ricevi semplicemente il mese scorso.

Esempio:

Oggi è: 2020-09-02

Codice:

echo date('Y-m-d', strtotime(date('Y-m-d')." -1 month"));

Risultato:

2020-08-02


Benvenuto in StackOverflow! Probabilmente, dovresti anche considerare di spiegare cosa succede se il giorno è 31e il mese non è gennaio o agosto (come 2020 May 31diventa 2020 April 31, che non esiste)
xKobalt

funzione incorporata di php "date", gestiscilo.
SL-phpdeveloper
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.