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

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

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

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

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


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

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

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)


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


11

Tu solución está aquí ...

$lastday = date('t',strtotime('today'));

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

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 

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

4
$date1 = $year.'-'.$month; 
$d = date_create_from_format('Y-m',$date1); 
$last_day = date_format($d, 't');

2

Usar Zend_Date es bastante fácil:

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

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

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


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

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.


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


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


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

-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


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

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

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.