¿Cómo encontrar el último día del mes desde la fecha?

382

¿Cómo puedo obtener el último día del mes en PHP?

Dado:

$a_date = "2009-11-23"

Quiero 2009-11-30; y dado

$a_date = "2009-12-23"

Quiero 2009-12-31.

Mithun Sreedharan
fuente

Respuestas:

805

tdevuelve el número de días en el mes de una fecha determinada (consulte los documentos paradate ):

$a_date = "2009-11-23";
echo date("Y-m-t", strtotime($a_date));
Dominic Rodger
fuente
99
Esto fallará después del año 2038. Entonces, en lugar de strtotime, se debe usar la función DateTime. El siguiente código funcionará sin el problema del año 2038: $ d = new DateTime ('2009-11-23'); echo $ d-> formato ('Ymt');
Mugunth
74
@Mugunth Si está trabajando con fechas de 24 años en el futuro, es posible que tenga problemas antes de 2038, sin embargo, los servidores ya se están moviendo a una arquitectura de 64 bits que nos dará unos 292 mil millones de años para corregir el problema.
Ninguno
1
en procedimiento -> $ fecha1 = $ año .'- '. $ mes; $ d = date_create_from_format ('Y-m', $ date1); $ last_day = date_format ($ d, 't');
kayla
11
Con DateTimeusted puede hacer algo como esto:(new DateTime('2009-11-23'))->modify('last day of')
Victor
Si está utilizando Carbon PHP, puede usar daysInMonth getter
astroanu
119

El código que usa strtotime () fallará después del año 2038. (como se indica en la primera respuesta en este hilo) Por ejemplo, intente usar lo siguiente:

$a_date = "2040-11-23";
echo date("Y-m-t", strtotime($a_date));

Dará respuesta como: 1970-01-31

Entonces, en lugar de strtotime, se debe usar la función DateTime. El siguiente código funcionará sin el problema del año 2038:

$d = new DateTime( '2040-11-23' ); 
echo $d->format( 'Y-m-t' );
Mugunth
fuente
17
Tendré 71 años y estaré retirado para entonces, ¡así que no es un problema para mí! j / k Pero en serio amigos, ¡presten atención a esta advertencia!
Volomike
17
Esto supone que está ejecutando una versión de PHP de 32 bits.
Ninguno
¿Por qué no se menciona este hecho alarmante sobre strtotime en el documento php php.net/manual/de/function.strtotime.php ?
Adam
1
@ Adam Ahora, no estoy seguro de si fue cuando lo revisaste. php.net/manual/de/…
Mave
1
A partir de 2018, el strtotimecódigo me da este resultado: 2040-11-30
Jee
104

Sé que esto es un poco tarde, pero creo que hay una manera más elegante de hacerlo PHP 5.3+usando la clase DateTime :

$date = new DateTime('now');
$date->modify('last day of this month');
echo $date->format('Y-m-d');
Hannoun Yassir
fuente
20
En una línea: $ date = new DateTime ('último día de este mes');
Harold
66
Es posible que desee agregar $ fecha-> modificar ('último día de este mes') -> setTime (23,59,59); si desea utilizar esta fecha y hora para comparar dónde importa el tiempo. (Esto te da el último segundo del mes)
omgitsdrobinoha
55
Esto funciona:$date = new DateTime('last day of 2020-2');
44
@ John, estás equivocado. el último día se calcula utilizando el objeto $ date y no la fecha del sistema. Pruébelo cambiando la primera línea con esto:$date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
Hannoun Yassir
55
Si tuviera que pensar o al menos intentar lo que le pedí que hiciera, vería que este mes significa el valor del mes en el objeto DateTime, no la fecha del sistema. Si no puede escribir / ejecutar código php, esto podría ayudar: sandbox.onlinephpfunctions.com/code/…
Hannoun Yassir
76

También existe la función PHP integrada cal_days_in_month () ?

"Esta función devolverá la cantidad de días en el mes del año para el calendario especificado". http://php.net/manual/en/function.cal-days-in-month .

echo cal_days_in_month(CAL_GREGORIAN, 11, 2009); 
// = 30
MPV
fuente
2
Esta respuesta es mucho más simple y apropiada que el uso de strtoTime. No veo ningún inconveniente. A la cima vas.
Tomás Zubiri
Esta debería haber sido la respuesta aceptada.
sieppl
24

Esto debería funcionar:

$week_start = strtotime('last Sunday', time());
$week_end = strtotime('next Sunday', time());

$month_start = strtotime('first day of this month', time());
$month_end = strtotime('last day of this month', time());

$year_start = strtotime('first day of January', time());
$year_end = strtotime('last day of December', time());

echo date('D, M jS Y', $week_start).'<br/>';
echo date('D, M jS Y', $week_end).'<br/>';

echo date('D, M jS Y', $month_start).'<br/>';
echo date('D, M jS Y', $month_end).'<br/>';

echo date('D, M jS Y', $year_start).'<br/>';
echo date('D, M jS Y', $year_end).'<br/>';
kaleazy
fuente
18

Lo que está mal: lo más elegante para mí es usar DateTime

Me pregunto si no veo DateTime::createFromFormat, una línea

$lastDay = \DateTime::createFromFormat("Y-m-d", "2009-11-23")->format("Y-m-t");
John Smith
fuente
2
Estoy de acuerdo. Esta solución (clase DateTime) es mucho mejor que usar las funciones antiguas de fecha y hora.
schellingerht
17

Puede crear una fecha para el primero del próximo mes y luego usar strtotime("-1 day", $firstOfNextMonth)

nikc.org
fuente
Un método alternativo que utiliza el mismo enfoque es dar a mktime el día 0 del mes siguientemktime(0, 0, 0, $month+1, 0, $year);
George
En cuanto a mí, el uso de strtotime()y mktime()se desalienta bec. de errores conocidos, como la determinación de la fecha al borde de los meses y los cálculos del año bisiesto. Como DateTimeestá disponible, debe usar esta clase para evitar problemas en el futuro. Como dije muchas veces antes que yo, ambos funcionan strtotime()y mktime()fallarán después de 2038. Por eso voté en contra ...
Paul T. Rawkeen
@ PaulT.Rawkeen Esta respuesta tiene más de 4 años. Al igual que con cualquier cosa en Internet, la edad debería ser un factor a la hora de medir la relevancia y la utilidad. Además, en mi humilde opinión, el tiempo de reducción a la mitad para cualquier cosa relacionada con la tecnología es particularmente corto.
nikc.org
@ nikc.org Estoy de acuerdo, especialmente con respecto al tiempo de vida para todas las soluciones técnicas y formas de resolver problemas. En este caso particular, la respuesta tiene un número relativamente bueno de votos a favor y, probablemente, alguien ( programador junior ) considerará esta respuesta como una solución aceptable antes. es corta y elegante :) y que probablemente va a obtener el resultado esperado, pero a medida que pasa el tiempo, esta forma de resolver este tipo de problemas se vuelve difícil y que debe advertir sobre estos hechos, cuando es posible. Saludos cordiales .
Paul T. Rawkeen
16

Intente esto, si está utilizando PHP 5.3+,

$a_date = "2009-11-23";
$date = new DateTime($a_date);
$date->modify('last day of this month');
echo $date->format('Y-m-d');

Para encontrar la última fecha del próximo mes, modifique de la siguiente manera,

 $date->modify('last day of 1 month');
 echo $date->format('Y-m-d');

y así..

Mohammed Safeer
fuente
11

Tu solución está aquí ...

$lastday = date('t',strtotime('today'));
Vineet Kadkol
fuente
1
esto da 31para lo Septemberque, como saben, eso no es correcto.
Iliyass Hamza
10

Puede encontrar el último día del mes de varias maneras. Pero simplemente puede hacer esto usando PHP strtotime () y la función date () . Me imagino que su código final se vería así:

$a_date = "2009-11-23";
echo date('Y-m-t',strtotime($a_date));

Demo en vivo

Pero si está utilizando PHP> = 5.2, le sugiero que use el nuevo objeto DateTime. Por ejemplo, como a continuación:

$a_date = "2009-11-23";
$date = new DateTime($a_date);
$date->modify('last day of this month');
echo $date->format('Y-m-d');

Demo en vivo

Además, puede resolver esto usando su propia función como a continuación:

/**
 * Last date of a month of a year
 *
 * @param[in] $date - Integer. Default = Current Month
 *
 * @return Last date of the month and year in yyyy-mm-dd format
 */
function last_day_of_the_month($date = '')
{
    $month  = date('m', strtotime($date));
    $year   = date('Y', strtotime($date));
    $result = strtotime("{$year}-{$month}-01");
    $result = strtotime('-1 second', strtotime('+1 month', $result));

    return date('Y-m-d', $result);
}

$a_date = "2009-11-23";
echo last_day_of_the_month($a_date);
Faisal
fuente
Gracias por su función, funciona como esperaba :)
Mankeomorakort
7

Si utiliza la extensión Carbon API para PHP DateTime, puede obtener el último día del mes con:

$date = Carbon::now();
$date->addMonth();
$date->day = 0;
echo $date->toDateString(); // use toDateTimeString() to get date and time 
eaykin
fuente
En realidad, si establece el día en -1, obtendrá el último pero uno. Por lo tanto, debe establecer el día en 0 para obtener el último día. $date->day = 0;
Giovanne Afonso
gracias @GiovanneAfonso que es correcto. Puse el día a 0 y probé la respuesta.
eaykin
1
Si está utilizando Carbon, un enfoque de una línea es utilizar: Carbon :: Now () -> endOfMonth (). Sin embargo, endOfMonth () es un modificador, por lo tanto, use "clonar" si tiene una variable existente que contenga una fecha de Carbono (o la fecha se modificará).
Charlie Dalsass
4

También puedes usarlo con datetime

$date = new \DateTime();
$nbrDay = $date->format('t');
$lastDay = $date->format('Y-m-t');
Ajouve
fuente
4
$date1 = $year.'-'.$month; 
$d = date_create_from_format('Y-m',$date1); 
$last_day = date_format($d, 't');
kayla
fuente
2

Usar Zend_Date es bastante fácil:

$date->setDay($date->get(Zend_Date::MONTH_DAYS));
mkerstner
fuente
2

Si tiene un mes sabio, obtenga la última fecha del mes, entonces,

public function getLastDateOfMonth($month)
    {
        $date = date('Y').'-'.$month.'-01';  //make date of month 
        return date('t', strtotime($date)); 
    }

$this->getLastDateOfMonth(01); //31
Kaushik shrimali
fuente
1

Aquí hay una función completa:

public function get_number_of_days_in_month($month, $year) {
    // Using first day of the month, it doesn't really matter
    $date = $year."-".$month."-1";
    return date("t", strtotime($date));
}

Esto generaría lo siguiente:

echo get_number_of_days_in_month(2,2014);

Salida: 28

Firze
fuente
1

Hay formas de obtener el último día del mes.

//to get last day of current month
echo date("t", strtotime('now'));

//to get last day from specific date
$date = "2014-07-24";
echo date("t", strtotime($date));

//to get last day from specific date by calendar
$date = "2014-07-24";
$dateArr=explode('-',$date);
echo cal_days_in_month(CAL_GREGORIAN, $dateArr[1], $dateArr[0]); 
viña
fuente
1

Llego tarde pero hay un puñado de maneras fáciles de hacer esto como se mencionó:

$days = date("t");
$days = cal_days_in_month(CAL_GREGORIAN, date('m'), date('Y'));
$days = date("j",mktime (date("H"),date("i"),date("s"),(date("n")+1),0,date("Y")));

Usar mktime () es mi objetivo para tener un control completo sobre todos los aspectos del tiempo ... IE

echo "<br> ".date("Y-n-j",mktime (date("H"),date("i"),date("s"),(11+1),0,2009));

Establecer el día en 0 y subir el mes 1 le dará el último día del mes anterior. El 0 y los números negativos tienen el mismo efecto en los diferentes argumentos. PHP: mktime - Manual

Como algunos han dicho, el tiempo de ejecución no es el camino más sólido y poco o nada es tan versátil.

JSG
fuente
1

Estoy usando strtotime con cal_days_in_month de la siguiente manera:

$date_at_last_of_month=date('Y-m-d', strtotime('2020-4-1
+'.(cal_days_in_month(CAL_GREGORIAN,4,2020)-1).' day'));
usuario2448808
fuente
0

Otra forma de usar mktime y no date ('t'):

$dateStart= date("Y-m-d", mktime(0, 0, 0, 10, 1, 2016)); //2016-10-01
$dateEnd = date("Y-m-d", mktime(0, 0, 0, 11, 0, 2016)); //This will return the last day of october, 2016-10-31 :)

De esta manera, calcula si son 31,30 o 29

Robin Rumeau
fuente
0

Extensión API de carbono para PHP DateTime

Carbon::parse("2009-11-23")->lastOfMonth()->day;

o

Carbon::createFromDate(2009, 11, 23)->lastOfMonth()->day;

volverá

30
josef
fuente
-1
function first_last_day($string, $first_last, $format) {
    $result = strtotime($string);
    $year = date('Y',$result);
    $month = date('m',$result);
    $result = strtotime("{$year}-{$month}-01");
    if ($first_last == 'last'){$result = strtotime('-1 second', strtotime('+1 month', $result)); }
    if ($format == 'unix'){return $result; }
    if ($format == 'standard'){return date('Y-m-d', $result); }
}

http://zkinformer.com/?p=134

Kevin
fuente
-2

Esta es una forma mucho más elegante de llegar a fin de mes:

  $thedate = Date('m/d/Y'); 
  $lastDayOfMOnth = date('d', mktime(0,0,0, date('m', strtotime($thedate))+1, 0, date('Y', strtotime($thedate)))); 
Louis Sterio
fuente
-3

Puede usar " t" en la función de fecha para obtener la cantidad de días en un mes en particular.

El código será algo como esto:

function lastDateOfMonth($Month, $Year=-1) {
    if ($Year < 0) $Year = 0+date("Y");
    $aMonth         = mktime(0, 0, 0, $Month, 1, $Year);
    $NumOfDay       = 0+date("t", $aMonth);
    $LastDayOfMonth = mktime(0, 0, 0, $Month, $NumOfDay, $Year);
    return $LastDayOfMonth;
}

for($Month = 1; $Month <= 12; $Month++)
    echo date("Y-n-j", lastDateOfMonth($Month))."\n";

El código se explica por sí mismo. Así que espero que ayude.

NawaMan
fuente