Bagaimana menemukan hari terakhir bulan itu dari tanggal?


382

Bagaimana saya bisa mendapatkan hari terakhir bulan ini di PHP?

Diberikan:

$a_date = "2009-11-23"

Saya ingin 2009-11-30; dan diberikan

$a_date = "2009-12-23"

Saya ingin 2009-12-31.

Jawaban:


805

tmengembalikan jumlah hari pada bulan tanggal tertentu (lihat dokumen untukdate ):

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

99
Ini akan gagal setelah tahun 2038. Jadi alih-alih strtotime, fungsi DateTime harus digunakan. Kode berikut akan berfungsi tanpa masalah Tahun 2038: $ d = DateTime baru ('2009-11-23'); echo $ d-> format ('Ymt');
Mugunth

74
@Mugunth Jika Anda bekerja dengan tanggal 24 tahun di masa depan, Anda mungkin mengalami masalah lebih cepat dari 2038, namun, server sudah beralih ke arsitektur 64-bit yang akan memberi kami sekitar 292 miliar tahun untuk memperbaiki masalah.
Tidak ada

1
dalam prosedural -> $ date1 = $ tahun .'- '. $ bulan; $ d = date_create_from_format ('Y-m', $ date1); $ last_day = date_format ($ d, 't');
Kayla

11
Dengan DateTimeAnda dapat melakukan sesuatu seperti ini:(new DateTime('2009-11-23'))->modify('last day of')
Victor

Jika Anda menggunakan Carbon PHP, Anda dapat menggunakan getter
daysInMonth

119

Kode yang menggunakan strtotime () akan gagal setelah tahun 2038. (seperti yang diberikan pada jawaban pertama di utas ini) Sebagai contoh coba gunakan yang berikut ini:

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

Ini akan memberikan jawaban sebagai: 1970-01-31

Jadi alih-alih strtotime, fungsi DateTime harus digunakan. Kode berikut akan berfungsi tanpa masalah Tahun 2038:

$d = new DateTime( '2040-11-23' ); 
echo $d->format( 'Y-m-t' );

17
Saya akan menjadi 71 dan pensiun pada saat itu, jadi tidak masalah bagi saya! j / k Tapi orang-orang yang serius - perhatikan peringatan ini!
Volomike

17
Ini mengasumsikan Anda menjalankan versi PHP 32-bit.
Tidak ada

mengapa fakta yang mengkhawatirkan tentang strtotime ini tidak disebutkan dalam php docu php.net/manual/de/function.strtotime.php ?
Adam

1
@Adam Sekarang, tidak yakin apakah itu ketika Anda memeriksa. php.net/manual/de/…
Mave

1
Pada 2018, strtotimekode memberi saya hasil ini: 2040-11-30
Jee

104

Saya tahu ini sedikit terlambat tetapi saya pikir ada cara yang lebih elegan untuk melakukan ini dengan PHP 5.3+menggunakan DateTime kelas :

$date = new DateTime('now');
$date->modify('last day of this month');
echo $date->format('Y-m-d');

20
Dalam satu baris: $ date = DateTime baru ('hari terakhir bulan ini');
Harold

6
Anda mungkin ingin menambahkan $ date-> memodifikasi ('hari terakhir bulan ini') -> setTime (23,59,59); jika Anda ingin menggunakan dateTime ini untuk perbandingan di mana waktu penting. (Ini memberi Anda detik terakhir bulan ini)
omgitsdrobinoha

5
Ini berfungsi:$date = new DateTime('last day of 2020-2');

4
@ John kamu salah. hari terakhir dihitung menggunakan objek $ date dan bukan tanggal sistem. Cobalah dengan mengubah baris pertama dengan ini:$date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
Hannoun Yassir

5
Jika Anda berpikir atau setidaknya mencoba apa yang saya minta Anda lakukan, Anda akan melihat bahwa bulan ini berarti nilai bulan dalam objek DateTime bukan tanggal sistem. Jika Anda tidak dapat mengetik / menjalankan kode php ini mungkin membantu: sandbox.onlinephpfunctions.com/code/…
Hannoun Yassir


24

Ini seharusnya bekerja:

$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

Apa yang salah - Yang paling elegan untuk saya gunakan DateTime

Saya heran saya tidak melihat DateTime::createFromFormat, satu kalimat

$lastDay = \DateTime::createFromFormat("Y-m-d", "2009-11-23")->format("Y-m-t");

2
Saya setuju. Solusi ini (kelas DateTime) jauh lebih baik daripada menggunakan fungsi datetime yang lama.
schellingerht

17

Anda bisa membuat tanggal untuk yang pertama bulan berikutnya, dan kemudian gunakan strtotime("-1 day", $firstOfNextMonth)


metode alternatif menggunakan pendekatan yang sama adalah memberi mktime hari ke 0 bulan berikutnyamktime(0, 0, 0, $month+1, 0, $year);
George

Bagi saya, penggunaan strtotime()dan mktime()tidak dianjurkan. bug yang dikenal seperti penentuan tanggal di tepi bulan dan perhitungan tahun kabisat. Karena DateTimetersedia, Anda harus menggunakan kelas ini untuk menghindari masalah di masa depan. Seperti yang dikatakan berkali-kali sebelum saya, kedua fungsi ini strtotime()dan mktime()akan gagal setelah 2038. Itu sebabnya saya menurunkan ...
Paul T. Rawkeen

@ PaulT.Rawkeen Jawaban ini lebih dari 4 tahun. Seperti halnya apa pun di internet, usia harus menjadi faktor ketika mengukur relevansi dan kegunaan. Lebih jauh lagi, IMHO, waktu separuh untuk apa pun yang berhubungan dengan teknologi sangat singkat.
nikc.org

@ nikc.org Saya setuju, terutama mengenai waktu hidup untuk semua solusi teknis dan cara penyelesaian masalah. Dalam kasus khusus ini, jawaban memiliki jumlah upvote yang relatif baik dan mungkin, seseorang ( programmer junior ) akan menganggap jawaban ini sebagai solusi yang dapat diterima. pendek dan elegan :) dan dia mungkin akan mendapatkan hasil yang diharapkan, tetapi seiring berjalannya waktu, cara memecahkan masalah semacam ini menjadi rumit dan kita harus memperingatkan tentang fakta-fakta seperti itu jika memungkinkan. Hormat kami .
Paul T. Rawkeen

16

Coba ini, jika Anda menggunakan 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');

Untuk menemukan bulan depan tanggal terakhir, ubah sebagai berikut,

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

dan seterusnya..


11

Solusi Anda ada di sini ..

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

1
ini memberikan 31untuk Septemberyang seperti yang Anda tahu itu tidak benar.
Iliyass Hamza

10

Anda dapat menemukan hari terakhir bulan ini beberapa cara. Tapi cukup Anda bisa melakukan ini menggunakan fungsi PHP strtotime () dan date (). Saya membayangkan kode akhir Anda akan terlihat seperti ini:

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

Demo Langsung

Tetapi jika Anda menggunakan PHP> = 5.2 Saya sangat menyarankan Anda menggunakan objek DateTime yang baru. Contohnya seperti di bawah ini:

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

Demo Langsung

Anda juga dapat menyelesaikan ini menggunakan fungsi Anda sendiri seperti di bawah ini:

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

Terima kasih atas fungsi Anda, ini berfungsi seperti yang saya harapkan :)
Mankeomorakort

7

Jika Anda menggunakan ekstensi Carbon API untuk PHP DateTime, Anda bisa mendapatkan hari terakhir bulan itu dengan:

$date = Carbon::now();
$date->addMonth();
$date->day = 0;
echo $date->toDateString(); // use toDateTimeString() to get date and time 

Sebenarnya, jika Anda menetapkan hari ke -1 itu akan mendapatkan yang terakhir tetapi satu. Jadi, Anda harus menetapkan hari ke 0 untuk mendapatkan hari terakhir. $date->day = 0;
Giovanne Afonso

terima kasih @GiovanneAfonso itu benar. Saya menetapkan hari ke 0 dan menguji jawabannya.
eaykin

1
Jika Anda menggunakan Carbon, pendekatan satu-liner adalah menggunakan: Carbon :: Now () -> endOfMonth (). Namun, endOfMonth () adalah pengubah, jadi gunakan "klon" jika Anda memiliki variabel yang ada memegang tanggal Karbon (atau tanggal akan diubah).
Charlie Dalsass

4

Anda juga bisa menggunakannya dengan 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

Menggunakan Zend_Date sangat mudah:

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

2

Jika Anda punya waktu sebulan untuk mendapatkan tanggal terakhir bulan itu,

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

$this->getLastDateOfMonth(01); //31

1

Berikut ini adalah fungsi lengkap:

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

Ini akan menghasilkan berikut:

echo get_number_of_days_in_month(2,2014);

Output: 28


1

Ada beberapa cara untuk mendapatkan hari terakhir bulan ini.

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

Saya terlambat tetapi ada beberapa cara mudah untuk melakukan ini seperti yang disebutkan:

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

Menggunakan mktime () adalah tujuan saya untuk kontrol penuh atas semua aspek waktu ... IE

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

Menyetel hari ke 0 dan menaikkan bulan 1 akan memberi Anda hari terakhir bulan sebelumnya. Angka 0 dan negatif memiliki pengaruh yang sama dalam argumen yang berbeda. PHP: mktime - Manual

Seperti yang dikatakan beberapa orang, strtotime bukanlah cara yang paling solid untuk digunakan dan sedikit jika tidak ada yang mudah serbaguna.


1

Saya menggunakan strtotime dengan cal_days_in_month sebagai berikut:

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


0

Cara lain menggunakan mktime dan bukan tanggal ('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 :)

Jadi cara ini menghitung apakah itu 31,30 atau 29


0

Ekstensi Carbon API untuk PHP DateTime

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

atau

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

akan kembali

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

Ini cara yang jauh lebih elegan untuk mendapatkan akhir bulan:

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

-3

Anda dapat menggunakan " t" fungsi tanggal untuk mendapatkan jumlah hari di bulan tertentu.

Kode akan menjadi seperti ini:

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

Kode ini dijelaskan sendiri. Jadi harap ini membantu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.