Pengenalan
Apabila bekerja dengan kelas DateTime PHP, a tingkah laku yang kelihatan membingungkan timbul apabila menambah bulan. Pembangun mungkin menjangkakan kenaikan mudah sebanyak satu, tetapi hasilnya sering menyimpang daripada jangkaan ini. Artikel ini menyiasat logik di sebalik tingkah laku ini dan meneroka penyelesaian untuk membetulkannya.
Tingkah Laku Yang Tidak Diingini: Rasional
Mengikut dokumentasi PHP, menambah atau menolak bulan dalam DateTime tidak semestinya menghasilkan perubahan yang sepadan pada tarikh. Pertimbangkan contoh berikut:
$date = new DateTime('2000-12-31'); $date->modify('+1 month'); echo $date->format('Y-m-d') . "\n"; // Outputs "2001-01-31"
Daripada mara ke 31 Januari, tarikh melonjak ke 3 Mac. Ini kerana Februari hanya mempunyai 28 hari (atau 29 semasa tahun lompat), jadi PHP melaraskan kiraan hari agar muat dalam bulan berikutnya.
Penyelesaian untuk Gelagat Yang Dijangka
Untuk mencapai gelagat yang diharapkan di mana penambahan bulan mengalihkan tarikh ke hari yang sepadan pada bulan berikutnya, semakan dan pembetulan manual diperlukan. Bilangan hari dalam bulan berikutnya mesti ditentukan dan ditambah pada tarikh semasa.
Pendekatan PHP 5.3 (Rangkap Masa Relatif)
Untuk PHP 5.3 dan yang lebih baru, rangkap masa relatif menyediakan penyelesaian yang lebih elegan:
$date = new DateTime('2010-01-31'); $date->modify('first day of next month'); echo $date->format('F') . "\n"; // Outputs "February"
Rangkap ini menggabungkan bulan depan dan hari pertama untuk memajukan tarikh ke hari pertama bulan berikutnya, memastikan tingkah laku yang diharapkan.
Atas ialah kandungan terperinci Mengapakah `DateTime::modify` PHP Menghasilkan Keputusan Yang Tidak Dijangka Apabila Menambah Bulan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!