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.

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

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

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

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


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

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

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)


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



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

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 

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

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

2

Usando o Zend_Date é bem fácil:

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

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

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


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

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.


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


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


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

-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

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.