online español day php date strtotime

php - español - strtotime to date online



¿Cómo obtener el mes y el año anterior en relación con el día de hoy, usando strtotime y date? (14)

Creo que has encontrado un error en la función strtotime. Cada vez que tengo que trabajar en esto, siempre me encuentro haciendo matemáticas en los valores de mes / año. Pruebe algo como esto:

$LastMonth = (date(''n'') - 1) % 12; $Year = date(''Y'') - !$LastMonth;

Necesito obtener el mes y el año anterior, en relación con la fecha actual.

Sin embargo, mira el siguiente ejemplo.

// Today is 2011-03-30 echo date(''Y-m-d'', strtotime(''last month'')); // Output: 2011-03-02

Este comportamiento es comprensible (hasta cierto punto), debido a la diferente cantidad de días en febrero y marzo, y el código en el ejemplo anterior es lo que necesito, pero funciona solo al 100% correctamente entre el 1 y el 28 de cada mes.

Entonces, ¿cómo obtener el mes pasado Y el año (piense en la date("Ym") ) de la manera más elegante posible, que funciona para todos los días del año? La solución óptima se basará en el análisis de argumentos de strtotime .

Actualizar. Para aclarar los requisitos un poco.

Tengo un código que obtiene algunas estadísticas de los últimos dos meses, pero primero muestro estadísticas del mes pasado y luego cargo otros meses cuando es necesario. Ese es el propósito. Por lo tanto, durante ESTE mes, quiero saber qué mes-año debo extraer para cargar las estadísticas del mes ANTERIOR.

También tengo un código que es consciente de la zona horaria (no es realmente importante en este momento), y acepta strtotime compatibles con strtotime como entrada (para inicializar la fecha interna), y luego permite ajustar la fecha / hora, también usando strtotime strings .

Sé que se puede hacer con pocos condicionales y matemáticas básicas, pero eso es realmente complicado, en comparación con esto, por ejemplo (si funcionó correctamente, por supuesto):

echo tz::date(''last month'')->format(''Y-d'')

Por lo tanto, SÓLO necesito mes y año anterior, de manera compatible con strtotime .

Respuesta (gracias, @dnagirl):

// Today is 2011-03-30 echo date(''Y-m-d'', strtotime(''first day of last month'')); // Output: 2011-02-01


Eche un vistazo a la clase DateTime . Debería hacer los cálculos correctamente y los formatos de fecha son compatibles con strttotime . Algo como:

$datestring=''2011-03-30 first day of last month''; $dt=date_create($datestring); echo $dt->format(''Y-m''); //2011-02


Encontré una respuesta ya que tuve el mismo problema hoy, que es el día 31. No es un error en php como algunos sugieren, pero es la funcionalidad esperada (en algunos desde). De acuerdo con este post lo que strtotime realmente hace es establecer el mes en uno y no modifica el número de días. Entonces, en el caso de hoy, 31 de mayo, está buscando el 31 de abril, que es una fecha no válida. Entonces toma el 30 de abril y luego agrega 1 día más allá y cede el 1 de mayo.

En su ejemplo, 2011-03-30, retrocederá un mes hasta el 30 de febrero, lo que no es válido ya que febrero solo tiene 28 días. Luego toma la diferencia de esos días (30-28 = 2) y luego se mueve dos días después del 28 de febrero, que es el 2 de marzo.

Como han señalado otros, la mejor forma de obtener "el último mes" es agregar el "primer día de" o el "último día de" utilizando strtotime o el objeto DateTime:

// Today being 2012-05-31 //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'');

Entonces, al usarlos es posible crear un rango de fechas si haces una consulta, etc.


Esto se debe a que el mes anterior tiene menos días que el mes actual. Lo he solucionado comprobando primero si el mes anterior tiene menos días que el actual y cambiando el cálculo en función de él.

Si tiene menos días, obtenga el último día de -1 mes más obtenga el día actual -1 mes:

if (date(''d'') > date(''d'', strtotime(''last day of -1 month''))) { $first_end = date(''Y-m-d'', strtotime(''last day of -1 month'')); } else { $first_end = date(''Y-m-d'', strtotime(''-1 month'')); }


Si desea el año y el mes anterior en relación con una fecha específica y tiene disponible DateTime, puede hacerlo:

$d = new DateTime(''2013-01-01'', new DateTimeZone(''UTC'')); $d->modify(''first day of previous month''); $year = $d->format(''Y''); //2012 $month = $d->format(''m''); //12


Si entiendo la pregunta correctamente, solo quiere el mes pasado y el año en que está:

<?php $month = date(''m''); $year = date(''Y''); $last_month = $month-1%12; echo ($last_month==0?($year-1):$year)."-".($last_month==0?''12'':$last_month); ?>

Aquí está el ejemplo: http://codepad.org/c99nVKG8


Si una solución DateTime es aceptable, este fragmento devuelve el año del último mes y el mes del mes pasado, evitando la posible trampa cuando ejecuta esto en enero.

function fn_LastMonthYearNumber() { $now = new DateTime(); $lastMonth = $now->sub(new DateInterval(''P1M'')); $lm= $lastMonth->format(''m''); $ly= $lastMonth->format(''Y''); return array($lm,$ly); }


Tal vez un poco más largo de lo esperado, pero he usado más código que tal vez necesario para que sea más legible.

Dicho esto, sale con el mismo resultado que usted obtiene: ¿qué es lo que quiere / espero que salga?

//Today is whenever I want it to be. $today = mktime(0,0,0,3,31,2011); $hour = date("H",$today); $minute = date("i",$today); $second = date("s",$today); $month = date("m",$today); $day = date("d",$today); $year = date("Y",$today); echo "Today: ".date(''Y-m-d'', $today)."<br/>"; echo "Recalulated: ".date("Y-m-d",mktime($hour,$minute,$second,$month-1,$day,$year));

Si solo quiere el mes y el año, simplemente configure el día para que sea ''01'' en lugar de tomar el ''día de hoy'':

$day = 1;

Eso debería darte lo que necesitas. Puede configurar la hora, minuto y segundo a cero, así como tampoco le interesa usarlos.

date("Y-m",mktime(0,0,0,$month-1,1,$year);

Reduce bastante ;-)


ehh, no es un error como una persona mencionó. ese es el comportamiento esperado ya que el número de días en un mes a menudo es diferente. La forma más fácil de obtener el mes anterior usando strtotime sería usar -1 mes a partir del primero de este mes.

$date_string = date(''Y-m'', strtotime(''-1 month'', strtotime(date(''Y-m-01''))));


si el día en sí no importa, haz lo siguiente:

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


strtotime tiene el segundo parámetro timestamp que hace que el primer parámetro se relacione con el segundo parámetro. Entonces puedes hacer esto:

date(''Y-m'', strtotime(''-1 month'', time()))


//return timestamp, use to format month, year as per requirement function getMonthYear($beforeMonth = '''') { if($beforeMonth !="" && $beforeMonth >= 1) { $date = date(''Y'')."-".date(''m'')."-15"; $timestamp_before = strtotime( $date . '' -''.$beforeMonth.'' month'' ); return $timestamp_before; } else { $time= time(); return $time; } } //call function $month_year = date("Y-m",getMonthYear(1));// last month before current month $month_year = date("Y-m",getMonthYear(2)); // second last month before current month


date(''Y-m'', strtotime(''first day of last month''));


function getOnemonthBefore($date){ $day = intval(date("t", strtotime("$date")));//get the last day of the month $month_date = date("y-m-d",strtotime("$date -$day days"));//get the day 1 month before return $month_date; }

La fecha resultante depende de la cantidad de días en que consiste el mes de entrada. Si el mes de entrada es febrero (28 días), 28 días antes del 5 de febrero es el 8 de enero. Si la entrada es 17, 31 días antes es el 16 de abril. Del mismo modo, si la entrada es mayo 31, la fecha resultante será el 30 de abril.

NOTA : la entrada toma la fecha completa (''ym-d'') y las salidas (''ym-d'') puede modificar este código para adaptarlo a sus necesidades.