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.

Mithun Sreedharan
sumber

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));
Dominic Rodger
sumber
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' );
Mugunth
sumber
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');
Hannoun Yassir
sumber
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
76

Ada juga fungsi built in PHP cal_days_in_month () ?

"Fungsi ini akan mengembalikan jumlah hari di bulan tahun untuk kalender yang ditentukan." http://php.net/manual/en/function.cal-days-in-month .

echo cal_days_in_month(CAL_GREGORIAN, 11, 2009); 
// = 30
MPV
sumber
2
Jawaban ini jauh lebih sederhana dan sesuai daripada penggunaan strtoTime. Saya tidak melihat kelemahan. Ke atas Anda pergi.
Tomas Zubiri
Ini seharusnya jawaban yang diterima.
sieppl
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/>';
kaleazy
sumber
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");
John Smith
sumber
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)

nikc.org
sumber
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..

Mohammed Safeer
sumber
11

Solusi Anda ada di sini ..

$lastday = date('t',strtotime('today'));
Vineet Kadkol
sumber
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);
Faisal
sumber
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 
eaykin
sumber
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');
Ajouve
sumber
4
$date1 = $year.'-'.$month; 
$d = date_create_from_format('Y-m',$date1); 
$last_day = date_format($d, 't');
kayla
sumber
2

Menggunakan Zend_Date sangat mudah:

$date->setDay($date->get(Zend_Date::MONTH_DAYS));
mkerstner
sumber
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
Kaushik shrimali
sumber
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

Firze
sumber
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]); 
anggur
sumber
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.

JSG
sumber
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'));
pengguna2448808
sumber
0

Saya telah membungkusnya dengan kelas pembantu waktu saya di sini https://github.com/normandqq/Date-Time-Helper menggunakan $dateLastDay = Model_DTHpr::getLastDayOfTheMonth();

Dan itu dilakukan

Norman
sumber
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

Robin Rumeau
sumber
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
Josef
sumber
-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
sumber
-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)))); 
Louis Sterio
sumber
-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.

NawaMan
sumber