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.

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

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"));

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"));

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

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'));

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>

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


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');
}

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.


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

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


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")));

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

}

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

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


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'

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


¡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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.