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.

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

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

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

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


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

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

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)


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


11

Twoje rozwiązanie jest tutaj ..

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

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

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 

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

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

2

Korzystanie z Zend_Date jest dość proste:

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

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

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


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

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.


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


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


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

-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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.