Kaedah PHP DateTime::modify boleh digunakan untuk menambah dan menolak bulan.
P粉046387133
P粉046387133 2023-08-06 18:43:52
0
2
588
<p>Saya telah banyak menggunakan kelas DateTime dan baru-baru ini terserempak dengan perkara yang saya anggap sebagai pepijat apabila menambah bulan. Selepas beberapa penyelidikan didapati bahawa ini sebenarnya bukan pepijat dan berfungsi seperti yang diharapkan. Menurut dokumentasi yang terdapat di sini: </p> <blockquote> <p>Contoh #2 Berhati-hati apabila menambah atau tolak bulan</p> </blockquote> <pre class="brush:php;toolbar:false;"><?php $date = new DateTime('2000-12-31'); $date->modify('+1 month'); echo $date->format('Y-m-d') "n"; $date->modify('+1 month'); echo $date->format('Y-m-d') "n"; ?></pra> <blockquote> <pre class="brush:php;toolbar:false;">Contoh di atas akan mengeluarkan: 31-01-2001 2001-03-03</pra> </blockquote> <p>Bolehkah sesiapa menjelaskan mengapa ini tidak dianggap sebagai pepijat? <br /><br />Selain itu, adakah sesiapa mempunyai sebarang penyelesaian yang elegan untuk membetulkannya supaya +1 bulan berfungsi seperti yang diharapkan dan bukannya seperti yang direka? </p><p><br /></p>
P粉046387133
P粉046387133

membalas semua(2)
P粉709307865

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粉030479054

Mengapa ini bukan pepijat:

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan