Como encontrar o último dia do mês a partir da data?

382

Como posso obter o último dia do mês em PHP?

Dado:

$a_date = "2009-11-23"

Eu quero 30-11-2009; e dado

$a_date = "2009-12-23"

Quero 31-12-2009.

Mithun Sreedharan
fonte

Respostas:

805

tretorna o número de dias no mês de uma determinada data (consulte os documentos paradate ):

$a_date = "2009-11-23";
echo date("Y-m-t", strtotime($a_date));
Dominic Rodger
fonte
99
Isso falhará após o ano 2038. Portanto, em vez de strtotime, a função DateTime deve ser usada. O código a seguir funcionará sem o problema do ano 2038: $ d = new DateTime ('2009-11-23'); eco $ d-> formato ('Ymt');
Mugunth
74
@Mugunth Se você estiver trabalhando com datas de 24 anos no futuro, poderá ter problemas antes de 2038, no entanto, os servidores já estão migrando para a arquitetura de 64 bits, o que nos dará cerca de 292 bilhões de anos para corrigir o problema.
Nenhum
11
em processual -> $ date1 = $ year .'- '. $ month; $ d = date_create_from_format ('Y-m', $ date1); $ last_day = date_format ($ d, 't');
Kayla
11
Com DateTimevocê pode fazer algo parecido com isto: #(new DateTime('2009-11-23'))->modify('last day of')
Victor Victor
Se você estiver usando carbono PHP você pode usar DaysInMonth getter
astroanu
119

O código que usa strtotime () falhará após o ano 2038. (conforme fornecido na primeira resposta neste segmento) Por exemplo, tente usar o seguinte:

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

Ele dará resposta como: 1970-01-31

Portanto, em vez de strtotime, a função DateTime deve ser usada. O código a seguir funcionará sem o problema do ano 2038:

$d = new DateTime( '2040-11-23' ); 
echo $d->format( 'Y-m-t' );
Mugunth
fonte
17
Eu terei 71 anos e me aposentarei até lá, então não é um problema para mim! j / k Mas, sério, pessoal - preste atenção a este aviso!
Volomike
17
Isso pressupõe que você esteja executando uma versão de 32 bits do PHP.
Nenhum dia
por que esse fato alarmante sobre strtotime não é mencionado no php docu php.net/manual/de/function.strtotime.php ?
19415 Adam
11
@ Adam Agora, não tenho certeza se foi quando você verificou. php.net/manual/de/...
Mave
11
A partir de 2018, o strtotimecódigo me fornecerá
Jee
104

Eu sei que isso é um pouco tarde, mas acho que há uma maneira mais elegante de fazer isso PHP 5.3+usando a classe DateTime :

$date = new DateTime('now');
$date->modify('last day of this month');
echo $date->format('Y-m-d');
Hannoun Yassir
fonte
20
Em uma linha: $ date = new DateTime ('último dia deste mês');
Harold
6
Você pode adicionar $ date-> modify ('último dia deste mês') -> setTime (23,59,59); se você deseja usar esse dateTime para comparação onde o tempo importa. (Isto dá-lhe o último segundo do mês)
omgitsdrobinoha
5
Isso funciona:$date = new DateTime('last day of 2020-2');
4
@ John você está errado. o último dia é calculado usando o objeto $ date e não a data do sistema. Experimente alterando a primeira linha com este:$date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
Hannoun Yassir 14/09
5
Se você pensar ou pelo menos tentar o que eu pedi, veria que este mês significa o valor do mês no objeto DateTime e não a data do sistema. Se você não pode digitar / executar código php isso pode ajudar: sandbox.onlinephpfunctions.com/code/...
Hannoun Yassir
76

Existe também a função PHP embutida cal_days_in_month () ?

"Esta função retornará o número de dias no mês do ano para o calendário especificado." http://php.net/manual/en/function.cal-days-in-month .

echo cal_days_in_month(CAL_GREGORIAN, 11, 2009); 
// = 30
MPV
fonte
2
Essa resposta é muito mais simples e apropriada do que o uso do strtoTime. Não vejo nenhuma desvantagem. Para o topo você vai.
Tomas Zubiri
Essa deveria ter sido a resposta aceita.
sieppl 21/04
24

Isso deve 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
fonte
18

O que está errado - O mais elegante para mim é usar DateTime

Gostaria de saber que não vejo DateTime::createFromFormat, one-liner

$lastDay = \DateTime::createFromFormat("Y-m-d", "2009-11-23")->format("Y-m-t");
john Smith
fonte
2
Concordo. Essa solução (classe DateTime) é muito melhor do que usar as funções antigas de data e hora.
schellingerht
17

Você pode criar uma data para o primeiro mês que vem e depois usar strtotime("-1 day", $firstOfNextMonth)

nikc.org
fonte
um método alternativo usando a mesma abordagem é dar mktime o dia 0 do próximo mêsmktime(0, 0, 0, $month+1, 0, $year);
George
Quanto a mim, o uso de strtotime()e mktime()é desencorajado porque. de bugs conhecidos, como a determinação da data nos limites dos meses e os cálculos dos anos bissextos. Como DateTimeestá disponível, você deve usar esta classe para evitar problemas no futuro. Como disse muitas vezes antes de mim, tanto estas funções strtotime()e mktime()irá falhar depois de 2038. É por isso que downvoted ...
Paul T. Rawkeen
@ PaulT.Rawkeen Esta resposta tem mais de 4 anos. Como em qualquer coisa na internet, a idade deve ser um fator ao avaliar a relevância e a utilidade. Além disso, IMHO, o tempo pela metade para qualquer coisa relacionada à tecnologia é particularmente curto.
Nikc.org
@ nikc.org Eu concordo, especialmente em relação ao tempo de vida de todas as soluções técnicas e maneiras de resolver problemas. Nesse caso em particular, a resposta tem um número relativamente bom de votos positivos e, provavelmente, alguém ( programador júnior ) considerará essa resposta como uma solução aceitável porque. é curto e elegante :) e ele provavelmente obterá o resultado esperado, mas com o passar do tempo, essa maneira de resolver esse tipo de problemas se torna complicada e devemos alertar sobre esses fatos sempre que possível. Atenciosamente .
Paul T. Rawkeen
16

Tente isso, se você estiver usando o PHP 5.3 ou superior,

$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 a data do próximo mês, modifique da seguinte maneira:

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

e assim por diante..

Mohammed Safeer
fonte
11

Sua solução está aqui ..

$lastday = date('t',strtotime('today'));
Vineet Kadkol
fonte
11
isso dá 31para Septemberque, como você sabe que não é correto.
Iliyass Hamza 26/08/15
10

Você pode encontrar o último dia do mês de várias maneiras. Mas simplesmente você pode fazer isso usando a função strtotime () e date () do PHP .

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

Demonstração ao vivo

Mas se você estiver usando PHP> = 5.2, sugiro fortemente que você use o novo objeto DateTime. Por exemplo, como abaixo:

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

Demonstração ao vivo

Além disso, você pode resolver isso usando sua própria função, como abaixo:

/**
 * 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
fonte
Obrigado pela sua função, ele funciona como eu esperava :)
Mankeomorakort
7

Se você usar a extensão da API do Carbon para PHP DateTime, poderá obter o último dia do mês com:

$date = Carbon::now();
$date->addMonth();
$date->day = 0;
echo $date->toDateString(); // use toDateTimeString() to get date and time 
eaykin
fonte
Na verdade, se você definir o dia como -1, o último será o último. Portanto, você deve definir o dia como 0 para obter o último dia. $date->day = 0;
Giovanne Afonso
obrigado @GiovanneAfonso, está correto. Defino o dia como 0 e testei a resposta.
eaykin
11
Se você estiver usando Carbon, uma abordagem de uma linha é usar: Carbon :: Now () -> endOfMonth (). No entanto, endOfMonth () é um modificador, portanto, use "clone" se você tiver uma variável existente mantendo uma data Carbon (ou a data será modificada).
101116 Charlie Dalsass
4

Você também pode usá-lo com data e hora

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

Usando o Zend_Date é bem fácil:

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

Se você tem um mês para obter a última data do mês,

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

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

Aqui está uma função 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));
}

Isso produziria o seguinte:

echo get_number_of_days_in_month(2,2014);

Saída: 28

Firze
fonte
1

Existem maneiras de obter o último dia do mês.

//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]); 
vinha
fonte
1

Estou atrasado, mas há várias maneiras fáceis de fazer isso, conforme mencionado:

$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 o mktime () é o meu caminho para obter controle completo sobre todos os aspectos do tempo ... IE

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

Definir o dia como 0 e mover o mês para cima 1 fornece o último dia do mês anterior. 0 e números negativos têm o mesmo efeito nos diferentes argumentos. PHP: mktime - Manual

Como alguns já disseram, o horário do strtotime não é o caminho mais sólido a percorrer e pouco, se nada for tão versátil.

JSG
fonte
1

Estou usando strtotime com cal_days_in_month da seguinte maneira:

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

Outra maneira de usar mktime e não 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 :)

Dessa forma, calcula se é 31,30 ou 29

Robin Rumeau
fonte
0

Extensão da API do Carbon para PHP DateTime

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

ou

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

retornará

30
josef
fonte
-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
fonte
-2

Essa é uma maneira muito mais elegante de chegar ao final do mês:

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

Você pode usar a função " t" na data para obter o número do dia em um determinado mês.

O código será algo como isto:

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

O código é auto-explicado. Então espero que ajude.

NawaMan
fonte