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.
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:
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));
DateTimevocê pode fazer algo parecido com isto: #(new DateTime('2009-11-23'))->modify('last day of')
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' );
strtotimecódigo me fornecerá
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');
$date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
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
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/>';
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");
Você pode criar uma data para o primeiro mês que vem e depois usar strtotime("-1 day", $firstOfNextMonth)
mktime(0, 0, 0, $month+1, 0, $year);
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 ...
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..
Sua solução está aqui ..
$lastday = date('t',strtotime('today'));
31para Septemberque, como você sabe que não é correto.
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));
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');
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);
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
$date->day = 0;
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
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
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]);
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.
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'));
Eu o envolvi na minha aula auxiliar de data e hora aqui
https://github.com/normandqq/Date-Time-Helper
usando
$dateLastDay = Model_DTHpr::getLastDayOfTheMonth();
E está feito
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
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); }
}
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))));
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.