strtotime mengembalikan tahun ini ketika input dalam format YYYY dan nilainya lebih besar dari 1999

Saya tidak yakin ini adalah bug karena setelah mencari saya tidak dapat menemukan pengalaman duplikat - namun, yang ini membuat saya bingung.

Saat berada di tengah skrip (yang agak menyakitkan) yang dimaksudkan untuk mengambil banyak catatan teks bebas dan mengubahnya menjadi catatan tanggal yang berguna, teman terpercaya saya strtotime() sepertinya mengecewakan saya.

Untuk tujuan pengujian, saya meringkas kodenya menjadi ini:

<?=date('Y', strtotime("1999"));?>

Keluaran menunjukkan: 1999

<?=date('Y', strtotime("1981"));?>

Keluaran menunjukkan: 1981

<?=date('Y', strtotime("2001"));?>

Keluaran menunjukkan: 2012

<?=date('Y', strtotime("2021"));?>

Keluaran menunjukkan: 2012

Semuanya tampak baik-baik saja sampai masukan melebihi "1999" - Sejak saat itu, setiap tahun sebelum dan sesudah tahun ini mengembalikan tahun berjalan (2012)

Setiap masukan sangat dihargai.


person cailen    schedule 23.02.2012    source sumber
comment
strtotime tidak pernah dapat dipercaya, dan itu pasti bukan teman Anda. itu hanya pelindian, bertahan seumur hidup, membicarakan alternatif yang lebih baik seperti DateTime.   -  person Marc B    schedule 24.02.2012


Jawaban (4)


Sesuai dengan dokumen format tanggal/waktu PHP:

Format "Tahun (dan hanya tahun)" hanya berfungsi jika string waktu telah ditemukan -- jika tidak, format ini dikenali sebagai HH MM.

(Catatan terakhir ke-2 di halaman).

person Marc B    schedule 23.02.2012
comment
Harus mengikuti jawaban yang memanggil saya karena RTFM tidak cukup hati-hati. Terima kasih semuanya, sangat membantu. - person cailen; 24.02.2012
comment
Maaf, tapi apa artinya string waktu sudah ditemukan sehubungan dengan berlalunya tahun ke strtotime? - person Euri Pinhollow; 13.11.2017

Coba awali tahun dengan Jan 1,.

Misalnya:

<?=date('Y', strtotime("Jan 1, 2021"));?> menghasilkan 2021 seperti yang diharapkan.

Saya menduga hal ini karena tahun-tahun tertentu dapat salah diurai sebagai pasangan bulan/hari, seperti "2012" yang diartikan sebagai "20 Desember tahun berjalan".

Jika Anda ingin bukti sendiri, coba ubah format tanggal menjadi r:
<?=date('r', strtotime('2001'));?> menghasilkan Thu, 23 Feb 2012 20:01:00

person Mr. Llama    schedule 23.02.2012

Masalahnya adalah, ini diurai sebagai waktu, apa yang dapat Anda lihat jika Anda menggunakan date('c') alih-alih date('Y');.

php > var_dump(date('c', strtotime("2001")));
string(25) "2012-02-23T20:01:00+01:00"

Anda harus memberikan nilai yang tidak ambigu misalnya 2012-01-01.

Solusi lain adalah dengan menggunakan fungsi, yang memungkinkan untuk menentukan format input yang diberikan, seperti strptime(), atau DateTime::createFromFormat()

php > echo DateTime::createFromFormat('Y', '2001')->format('c');
2001-02-23T22:29:56+01:00
person KingCrunch    schedule 23.02.2012

Gunakan ini:

echo date('Y', strtotime("1/1/2001"));
echo date('Y', strtotime("1/1/2021"));

Menggunakan 4 digit sebagai tanggal dapat diartikan sebagai waktu, Anda harus menggunakan format yang lebih spesifik untuk memastikan fungsi tersebut berfungsi sesuai harapan Anda. Jadi tahun 2021 adalah 20:21 (format 24 jam) tahun 2012

person John    schedule 23.02.2012