Jak znaleźć ostatni dzień miesiąca od daty?

382

Jak mogę uzyskać ostatni dzień miesiąca w PHP?

Dany:

$a_date = "2009-11-23"

Chcę 30.11.2009; i dane

$a_date = "2009-12-23"

Chcę 31.12.2009.

Mithun Sreedharan
źródło

Odpowiedzi:

805

tzwraca liczbę dni w miesiącu określonej daty (patrz dokumentacja dladate ):

$a_date = "2009-11-23";
echo date("Y-m-t", strtotime($a_date));
Dominic Rodger
źródło
99
Nie powiedzie się to po roku 2038. Dlatego zamiast strtotime należy użyć funkcji DateTime. Poniższy kod będzie działał bez problemu w roku 2038: $ d = nowa data i godzina („23.11.2009”); echo $ d-> format („Ymt”);
Mugunth
74
@Muntunth Jeśli pracujesz z datami 24 lata w przyszłości, możesz napotkać problemy wcześniej niż w 2038 roku, jednak serwery już przechodzą na architekturę 64-bitową, co da nam około 292 miliardów lat na rozwiązanie problemu.
Brak,
1
w procedurze -> $ data1 = $ rok .'- '. $ miesiąc; $ d = date_create_from_format („Y-m”, $ date1); $ last_day = data_format ($ d, 't');
kayla
11
Dzięki DateTimeniemu możesz zrobić coś takiego:(new DateTime('2009-11-23'))->modify('last day of')
Victor
Jeśli korzystasz z Carbon PHP, możesz użyć daysInMonth getter
astroanu
119

Kod korzystający z funkcji strtotime () zawiedzie po roku 2038. (jak podano w pierwszej odpowiedzi w tym wątku) Na przykład spróbuj użyć następujących czynności:

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

Odpowiedź da: 1970-01-31

Dlatego zamiast strtotime należy użyć funkcji DateTime. Poniższy kod będzie działał bez problemu w roku 2038:

$d = new DateTime( '2040-11-23' ); 
echo $d->format( 'Y-m-t' );
Mugunth
źródło
17
Mam wtedy 71 lat i jestem na emeryturze, więc nie ma dla mnie problemu! j / k Ale poważnie ludzie - zważ na to ostrzeżenie!
Volomike,
17
Zakłada się, że używasz 32-bitowej wersji PHP.
Brak,
dlaczego ten alarmujący fakt o strtotime nie jest wspomniany w php docu php.net/manual/de/function.strtotime.php ?
Adam,
1
@Adam Nie jest teraz pewne, czy było to podczas sprawdzania. php.net/manual/de/…
Mave
1
Od 2018 roku strtotimekod daje mi ten wynik: 2040-11-30
Jee
104

Wiem, że jest to trochę za późno, ale myślę, że jest bardziej elegancki sposób, aby to zrobić PHP 5.3+za pomocą klasy DateTime :

$date = new DateTime('now');
$date->modify('last day of this month');
echo $date->format('Y-m-d');
Hannoun Yassir
źródło
20
W jednym wierszu: $ date = new DateTime („ostatni dzień tego miesiąca”);
Harold
6
Możesz dodać $ date-> modyfikować („ostatni dzień tego miesiąca”) -> setTime (23,59,59); jeśli chcesz użyć tej daty do porównania, gdy liczy się czas. (To daje ostatnią sekundę miesiąca)
omgitsdrobinoha
5
Działa to:$date = new DateTime('last day of 2020-2');
4
@John się mylisz. ostatni dzień jest obliczany na podstawie obiektu $ date, a nie daty systemowej. Spróbuj, zmieniając pierwszą linię w ten sposób:$date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
Hannoun Yassir
5
Jeśli pomyślisz lub przynajmniej spróbujesz tego, o co cię prosiłem, zobaczysz, że ten miesiąc oznacza wartość miesiąca w obiekcie DateTime, a nie datę systemową. Jeśli nie możesz wpisać / uruchomić kodu php, może to pomóc: sandbox.onlinephpfunctions.com/code/…
Hannoun Yassir
76

Jest też wbudowana funkcja PHP cal_days_in_month () ?

„Ta funkcja zwróci liczbę dni w miesiącu roku dla określonego kalendarza.” http://php.net/manual/en/function.cal-days-in-month .

echo cal_days_in_month(CAL_GREGORIAN, 11, 2009); 
// = 30
MPV
źródło
2
Ta odpowiedź jest znacznie prostsza i odpowiedniejsza niż użycie strtoTime. Nie widzę żadnych wad. Na sam szczyt.
Tomas Zubiri,
To powinna być zaakceptowana odpowiedź.
sieppl
24

To powinno działać:

$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
źródło
18

Co jest nie tak - najbardziej eleganckie jest dla mnie używanie DateTime

Zastanawiam się, nie widzę DateTime::createFromFormat, jedno-liniowy

$lastDay = \DateTime::createFromFormat("Y-m-d", "2009-11-23")->format("Y-m-t");
John Smith
źródło
2
Zgadzam się. To rozwiązanie (klasa DateTime) jest znacznie lepsze niż używanie starych funkcji datetime.
schellingerht
17

Możesz utworzyć datę pierwszego następnego miesiąca, a następnie użyć strtotime("-1 day", $firstOfNextMonth)

nikc.org
źródło
alternatywną metodą wykorzystującą to samo podejście jest nadanie mktime 0. dnia następnego miesiącamktime(0, 0, 0, $month+1, 0, $year);
George
Jeśli chodzi o mnie, używanie strtotime()i mktime()jest odradzane, ponieważ. znanych błędów, takich jak ustalanie daty na skraju miesięcy i liczenie lat przestępnych. Ponieważ DateTimejest dostępny, należy użyć tej klasy, aby uniknąć problemów w przyszłości. Jak już wielokrotnie mówiłem, oba te funkcje działają strtotime()i mktime()nie będą działać po 2038 r. Dlatego głosowałem za tym ...
Paul T. Rawkeen,
@ PaulT.Rawkeen Ta odpowiedź ma więcej niż 4 lata. Podobnie jak w przypadku wszystkiego w Internecie, wiek powinien być czynnikiem przy ocenie trafności i przydatności. Co więcej, IMHO, czas połowu na wszystko, co związane z technologią, jest szczególnie krótki.
nikc.org,
@ nikc.org Zgadzam się, zwłaszcza jeśli chodzi o czas życia wszystkich rozwiązań technicznych i sposobów rozwiązywania problemów. W tym konkretnym przypadku odpowiedź ma stosunkowo dobrą liczbę głosów pozytywnych i prawdopodobnie ktoś ( młodszy programista ) uzna tę odpowiedź za akceptowalne rozwiązanie, ponieważ. jest krótki i elegancki :) i prawdopodobnie osiągnie oczekiwany rezultat, ale z czasem ten sposób rozwiązywania tego rodzaju problemów staje się trudny i powinniśmy ostrzec o takich faktach, gdy jest to możliwe. Z pozdrowieniami .
Paul T. Rawkeen,
16

Spróbuj tego, jeśli używasz 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');

Aby znaleźć datę ostatniego miesiąca następnego miesiąca, zmodyfikuj w następujący sposób,

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

i tak dalej..

Mohammed Safeer
źródło
11

Twoje rozwiązanie jest tutaj ..

$lastday = date('t',strtotime('today'));
Vineet Kadkol
źródło
1
to daje 31do Septemberktórych, jak wiesz, że nie jest to poprawne.
Iliyass Hamza
10

Ostatni dzień miesiąca można znaleźć na kilka sposobów. Ale po prostu możesz to zrobić za pomocą funkcji PHP strtotime () i date (). Wyobrażam sobie, że twój końcowy kod wyglądałby mniej więcej tak:

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

Demo na żywo

Ale jeśli używasz PHP> = 5.2 Zdecydowanie sugeruję użycie nowego obiektu DateTime. Na przykład jak poniżej:

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

Demo na żywo

Możesz rozwiązać ten problem, korzystając z własnej funkcji, takiej jak poniżej:

/**
 * 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
źródło
Dziękuję za twoją funkcję, działa zgodnie z oczekiwaniami :)
Mankeomorakort,
7

Jeśli używasz rozszerzenia Carbon API dla PHP DateTime, możesz uzyskać ostatni dzień miesiąca dzięki:

$date = Carbon::now();
$date->addMonth();
$date->day = 0;
echo $date->toDateString(); // use toDateTimeString() to get date and time 
eaykin
źródło
Właściwie, jeśli ustawisz dzień na -1, dostaniesz przedostatni. Musisz ustawić dzień na 0, aby uzyskać ostatni dzień. $date->day = 0;
Giovanne Afonso
dziękuję @ GiovanneAfonso, to jest poprawne. Ustawiłem dzień na 0 i przetestowałem odpowiedź.
eaykin
1
Jeśli używasz Carbon, możesz zastosować jedną linijkę: Carbon :: Now () -> endOfMonth (). Jednak endOfMonth () jest modyfikatorem, więc użyj „klonuj”, jeśli masz istniejącą zmienną zawierającą datę węgla (lub data zostanie zmodyfikowana).
Charlie Dalsass,
4

Możesz także używać go z datetime

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

Korzystanie z Zend_Date jest dość proste:

$date->setDay($date->get(Zend_Date::MONTH_DAYS));
mkerstner
źródło
2

Jeśli masz miesiąc, wybierz ostatnią datę miesiąca,

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

$this->getLastDateOfMonth(01); //31
Kaushik shrimali
źródło
1

Oto pełna funkcja:

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

Wynikiem tego będzie:

echo get_number_of_days_in_month(2,2014);

Wyjście: 28

Firze
źródło
1

Są sposoby na zdobycie ostatniego dnia miesiąca.

//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]); 
winorośl
źródło
1

Jestem spóźniony, ale jest kilka łatwych sposobów, jak to wspomniano:

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

Używanie mktime () to moja droga do pełnej kontroli nad wszystkimi aspektami czasu ... IE

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

Ustawienie dnia na 0 i przesunięcie miesiąca o 1 daje ostatni dzień poprzedniego miesiąca. 0 i liczby ujemne mają podobny wpływ w różnych argumentach. PHP: mktime - Podręcznik

Jak niektórzy powiedzieli, strtotime nie jest najsolidniejszą drogą, a mało, jeśli żadna nie jest tak łatwa w użyciu.

JSG
źródło
1

Używam strtotime z cal_days_in_month w następujący sposób:

$date_at_last_of_month=date('Y-m-d', strtotime('2020-4-1
+'.(cal_days_in_month(CAL_GREGORIAN,4,2020)-1).' day'));
użytkownik2448808
źródło
0

Innym sposobem jest użycie mktime i not 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 :)

W ten sposób oblicza, czy jest to 31,30 lub 29

Robin Rumeau
źródło
0

Rozszerzenie Carbon API dla PHP DateTime

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

lub

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

wróci

30
Josef
źródło
-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
źródło
-2

Jest to o wiele bardziej elegancki sposób na koniec miesiąca:

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

Możesz użyć funkcji „ t” w funkcji daty, aby uzyskać liczbę dni w danym miesiącu.

Kod będzie mniej więcej taki:

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

Kod jest objaśniany samodzielnie. Mam nadzieję, że to pomoże.

NawaMan
źródło