Obtener la fecha del último mes en php

84

Quiero obtener la fecha del mes pasado. Escribí esto:

$prevmonth = date('M Y');

Lo que me da el mes / año actual. No puedo decir si debería usar strtotime, mktime. ¿Algo relacionado con la marca de tiempo? ¿Debo agregar algo después para restablecer, de modo que la fecha no se establezca en el último mes en todo para todas las marcas de tiempo en mi sitio? Estoy intentando RTM, pero me resulta difícil darme cuenta.

pág.
fuente

Respuestas:

208

Es simple obtener la fecha del último mes

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

el 3 de noviembre vuelve

2014-10-1
2014-10-31
OzzyCheca
fuente
7
Este no es lo suficientemente bueno y puede causar errores en su código: $time = strtotime('2011-03-30 01:01:01'); echo date('r', strtotime('-1 month', $time));este devolverá el miércoles 02 de marzo de 2011 01:01:01 - ¡no febrero! Úselo en su strtotime('first day of previous month')lugar
Ostin
@OzzyCzech ¿Regresa el 1 y 31 de octubre cuando lo ejecuta el 3 de marzo?
The Unknown Dev
$ data_day_str = strtotime ("mes anterior", strtotime ('2011-03-30 01:01:01')); Obtendrá febrero de 2011.
Rodrigo Serzedello
31
echo strtotime("-1 month");

Eso generará la marca de tiempo del último mes exactamente. No es necesario restablecer nada después. Si lo desea en un formato en inglés después de eso, puede usar date () para formatear la marca de tiempo, es decir:

echo date("Y-m-d H:i:s",strtotime("-1 month"));
zombat
fuente
12
Hoy es 31 de octubre de 2012. date ("Ymd", strtotime ("- 1 mes")); Devoluciones 2012-10-01. :(
Todd
7
@toddsler Correcto. -1 mes es lo mismo que escribir -30 días, que en ciertas fechas durante el año saltará 1 mes o permanecerá en el mismo mes, así que tenga cuidado con este método.
Silkfire
¡NO USE ESTA SOLUCIÓN! Los comentarios anteriores son correctos, tendrá errores que se activarán solo el día 31 del mes (o en 29,30,31 de marzo)
adolescentes
19
$prevmonth = date('M Y', strtotime("last month"));
Ardillas
fuente
3
Esto es lo mismo que date ('M Y', strtotime ("- 1 mes")), si haces algo como date ('M Y', strtotime ("2017-07-31 el mes pasado")) volverá 2017-07-01, ¡así que ten cuidado! date ('M Y', strtotime ('2017-07-31 primer día del mes anterior')) le daría lo que desea
Shadoweb
12

Las respuestas incorrectas son:

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

La razón es si el mes actual tiene más de 30 días pero el mes anterior es 29 y menos $ lastMonth será el mismo que el mes actual.

p.ej

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 respuesta correcta será:

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
Furia
fuente
1
Daría un voto positivo si elimina echo sprintf ("% 02d", date ("m") - 1). fecha ("- Y"); => 02-2016. Si estamos en enero, responde el mes 0 de este año, ¡no el 12 del año pasado!
Tama
6

si desea obtener el mes anterior, puede usarlo como sigue

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

Si desea obtener los mismos días del mes anterior, puede usarlo como sigue.

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

Si desea obtener la última fecha del mes anterior, puede usarlo como sigue ...

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

Si desea obtener la primera fecha del mes anterior, puede usarlo como sigue ...

$prevmonth = date('M Y 1', strtotime('-1 months'));
Md. Maruf Hossain
fuente
3
¡Cuidado con el 31 del mes! ¡Te dará el día 1 del mes actual! Véase más arriba.
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>
Vaishu
fuente
3
Esta respuesta no es correcta cuando la fecha actual es 2018/03/31. Detalle también como este
Ngoc Nam
4

Encontré este mal cuando los meses anteriores son más cortos que los actuales.

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

Pruebe el 30 de marzo y obtendrá 2012-03-01 en lugar de 2012-02 ...

Trabajando en una mejor solución ...

Jay_69
fuente
3
Esta respuesta es correcta (-1 mes no funcionará correctamente en todos los casos). Para el mes anterior, use strtotime ('último mes').
Mike
1
El mes pasado o -1 mes devuelve el mismo valor.
Etienne Dupuis
3
public function getLastMonth() {
    $now = new DateTime();
    $lastMonth = $now->sub(new DateInterval('P1M'));
    return $lastMonth->format('Ym');
}

fuente
1
No funcionará 2015-10-31en PHP 5.5 y 5.6.11. Obtendrá el 201510mismo comportamiento que con strtotime('- 1 month).
pmayer
2

Utilice este código corto para obtener el mes anterior para cualquier fecha determinada:

$tgl = '25 january 2012';

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

El resultado es diciembre de 2011. Funciona en un mes con un día más corto que el mes anterior.

Abdul
fuente
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);
numen sangriento
fuente
4
Si bien el código en sí puede ser algo autoexplicativo, es útil para otros usuarios explicar su respuesta en lugar de solo dar código.
Turnerj
1

Puedes usar strtotime, lo cual es genial en este tipo de situaciones:

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

Te conseguirá:

string '2009-11' (length=7)
Pascal MARTIN
fuente
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);

funciona el 30.03.2012

Paul
fuente
1

Oh, me di cuenta de esto, ignórelo a menos que tenga el mismo problema que yo, en cuyo caso:

$prevmonth = date("M Y",mktime(0,0,0,date("m")-1,1,date("Y")));
pág.
fuente
1

La mejor solución que he encontrado es esta:

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

        }
        return $finalMonth;

    }

Entonces, si estamos en 3 (marzo) y queremos restar 5 meses, eso sería

subtractMonth(3,5);

lo que daría 10 (octubre). Si también se desea el año, se podría hacer esto:

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

}
Rafael Anschau
fuente
0

Esto funciona para mi:

Hoy es: 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
Yiannis Christodoulou
fuente
Solo funciona en el 58,3 (3)% de los casos. ¿Qué pasa con febrero, abril, junio, septiembre y noviembre? No tienen 31 días.
Taz
0

Si desea obtener la primera fecha del mes anterior, puede usarlo como sigue ... $prevmonth = date('M Y 1', strtotime('-1 months'));¿qué? la primera cita siempre será 1: D

usuario2846324
fuente
31 de octubre de 2012. Regresa 2012-10-01
Akira Yamamoto
0

Esta pregunta es bastante antigua, pero aquí va de todos modos. Si está tratando de obtener solo el mes anterior y el día no importa, puede usar esto:

$date = '2014-01-03';

$dateTime = new DateTime($date);

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

echo $lastMonth; // 'December 2013'
Jay Kravetz
fuente
0

Simplemente obtenga el mes pasado.

Ejemplo:

Hoy es: 2020-09-02

Código:

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

Resultado:

2020-08-02

SL-phpdeveloper
fuente
¡Bienvenido a StackOverflow! Probablemente, también deberías considerar explicar qué sucede si el día es 31y el mes no es enero o agosto (como se 2020 May 31convierte 2020 April 31, eso no existe)
xKobalt
php función incorporada "fecha", maneje.
SL-phpdeveloper