Rumah > Soal Jawab > teks badan
P粉7093078652023-08-07 13:27:57
Ini adalah satu lagi penyelesaian kemas yang menggunakan kaedah DateTime sepenuhnya untuk mengubah suai objek secara langsung tanpa membuat klon.
$dt = new DateTime('2012-01-31'); echo $dt->format('Y-m-d'), PHP_EOL; $day = $dt->format('j'); $dt->modify('first day of +1 month'); $dt->modify('+' . (min($day, $dt->format('t')) - 1) . ' days'); echo $dt->format('Y-m-d'), PHP_EOL;
Keluarannya ialah:
2012-01-31 2012-02-29
P粉0304790542023-08-07 09:48:12
Tingkah laku semasa adalah betul. Inilah yang berlaku secara dalaman:
+1 bulan menambah bulan (asal 1) sebanyak 1. Ini menukar tarikh kepada 2010-02-31.
Februari 2010 hanya mempunyai 28 hari, jadi PHP akan membetulkan masalah ini secara automatik dan terus mengira hari mulai 1 Februari. Jadi tarikh akhir yang kami dapat ialah 3 Mac.
Cara untuk mendapatkan hasil yang anda inginkan:
Untuk mendapatkan hasil yang anda inginkan, anda boleh menyemak secara manual pada bulan berikutnya dan kemudian menambah bilangan hari dalam bulan berikutnya.
Semoga anda boleh menulis kod ini sendiri. Saya hanya menyediakan langkah-langkah tertentu.
Pendekatan PHP 5.3:
Untuk mendapatkan tingkah laku yang betul anda boleh menggunakan penyataan masa relatif "hari pertama" yang diperkenalkan dalam PHP 5.3. Penyata ini boleh digunakan bersama dengan "bulan depan", "bulan kelima" atau "+8 bulan" untuk pergi ke hari pertama bulan yang ditentukan. Berbanding dengan "+1 bulan" yang sedang anda gunakan, anda boleh menggunakan kod berikut untuk mendapatkan hari pertama bulan berikutnya:
<?php $d = new DateTime( '2010-01-31' ); $d->modify( 'first day of next month' ); echo $d->format( 'F' ), "\n"; ?>
Skrip ini akan dikeluarkan dengan betul pada bulan Februari. Apabila PHP memproses penyata hari pertama bulan depan ini, perkara berikut berlaku:
bulan depan menambah bulan (asal 1) sebanyak 1. Ini menukar tarikh kepada 2010-02-31.
hari pertama menetapkan bilangan hari dalam tarikh kepada 1, menyebabkan tarikh menjadi 2010-02-01.