Saat menginisialisasi Date
objek baru di JavaScript menggunakan panggilan di bawah ini, saya menemukan bahwa argumen bulan dihitung mulai dari nol.
new Date(2010, 3, 1); // that's the 1st April 2010!
Mengapa argumen bulan dimulai dari 0? Sebaliknya, argumen hari dalam sebulan (yang terakhir) adalah angka dari 1 hingga 31. Apakah ada alasan bagus untuk ini?
javascript
datetime
date
Agnel Kurian
sumber
sumber
the Day of the week (integer)
0-6Jawaban:
Ini adalah tua (mungkin disayangkan, mungkin sekarat) tradisi dalam dunia pemrograman, lihat standar lama (POSIX) localtime C fungsi http://linux.die.net/man/3/localtime
sumber
Date
Objek JS diporting dari Java 1.0, itu sebabnya. Mewarisi semua kekurangannya ... stackoverflow.com/questions/344380/…Jawaban sebenarnya untuk pertanyaan ini, adalah bahwa itu disalin dari
java.util.Date
, yang juga memiliki keanehan ini. Bukti dapat ditemukan di Twitter dari Brendan Eich - orang yang awalnya menerapkan JavaScript (termasukDate
objeknya):https://twitter.com/BrendanEich/status/481939099138654209
https://twitter.com/BrendanEich/status/771006397886533632
Ini terjadi pada tahun 1995, dan JDK 1.0 masih dalam versi beta. Ini diluncurkan pada tahun 1996. Pada tahun 1997, JDK 1.1 keluar yang menghentikan sebagian besar fungsi
java.util.Date
, memindahkannya kejava.util.Calendar
, tetapi bahkan itu masih memiliki bulan berbasis nol. Pengembang yang bosan dengan hal ini membuat pustaka Joda-Time , yang akhirnya menghasilkanjava.time
paket yang dimasukkan ke dalam Java 8 (2014).Singkatnya, butuh 18 tahun bagi Java untuk mendapatkan API tanggal / waktu yang dirancang dengan benar di dalamnya, tetapi JavaScript masih tertahan di masa kegelapan. Kami memang memiliki pustaka yang sangat baik seperti Moment.js , date-fns , dan js-joda . Tapi sampai sekarang, tidak ada yang lebih dari
Date
bahasa bawaan. Semoga ini akan berubah dalam waktu dekat.sumber
Semuanya kecuali hari dalam sebulan berbasis 0, lihat di sini untuk daftar lengkap termasuk rentang :)
Sebenarnya 1 hari berbasis itulah yang aneh di sini ... cukup aneh. Mengapa ini dilakukan? Saya tidak tahu ... tapi mungkin terjadi pada pertemuan yang sama ketika mereka terpampang dan memutuskan titik koma adalah opsional.
sumber
{ "first", "second", "third", ..., "twenty-seventh", ... }
) dan mencoba mengindeksnyatm_mday
. Kemudian lagi, mungkin mereka hanya melihat utilitas mutlak dalam membuat off dengan satu kesalahan kejadian biasa.Selalu ada 12 bulan dalam setahun, jadi implementasi C awal mungkin menggunakan array lebar tetap statis dengan indeks 0..11.
sumber
Ini seperti ini di java juga .. Mungkin untuk mengkonversi int ke string (0 - jan ,, 1-feb), mereka mengkodekan dengan cara ini .. karena mereka mungkin memiliki array string (diindeks dari 0) dari nama bulan dan bulan ini angka jika dimulai dari 0, akan jauh lebih mudah untuk memetakan ke string bulan ..
sumber
Saya tahu ini sebenarnya bukan jawaban untuk pertanyaan asli, tetapi saya hanya ingin menunjukkan solusi yang saya sukai untuk masalah ini, yang sepertinya tidak pernah saya ingat karena muncul dari waktu ke waktu.
Fungsi kecil dari nol melakukan trik mengisi nol jika diperlukan, dan bulan baru saja
+1
ditambahkan:Tapi ya, Date memiliki API yang sangat tidak intuitif, saya tertawa ketika membaca Twitter Brendan Eich.
sumber
Mereka mungkin menganggap bulan sebagai pencacahan (indeks pertama adalah 0) dan hari bukan karena mereka tidak memiliki nama yang terkait dengannya.
Atau lebih tepatnya, mereka mengira angka hari adalah representasi sebenarnya dari hari itu (dengan cara yang sama bulan direpresentasikan sebagai angka dalam tanggal seperti 31/12), seolah-olah Anda bisa membuat pencacahan dengan angka sebagai variabel, tetapi sebenarnya Berbasis 0.
Jadi sebenarnya, selama berbulan-bulan, mungkin mereka mengira representasi pencacahan yang tepat adalah dengan menggunakan nama bulan, bukan angka, dan mereka akan melakukan hal yang sama jika hari memiliki representasi nama. Bayangkan jika kita mengatakan Lima Januari, Enam Januari, bukannya 5 Januari, 6 Januari, dll., Maka mungkin mereka juga akan membuat pencacahan berbasis 0 selama berhari-hari ...
Mungkin secara tidak sadar mereka berpikir tentang pencacahan selama berbulan-bulan sebagai {Januari, Februari, ...} dan untuk hari-hari sebagai {Satu, Dua, Tiga, ...}, kecuali untuk hari-hari Anda mengakses hari itu sebagai angka dan bukan namanya, seperti 1 untuk Satu, dll., jadi tidak mungkin untuk memulai dari 0 ...
sumber
Ini mungkin cacat, tapi ini juga sangat berguna ketika Anda ingin merepresentasikan bulan atau hari dalam seminggu sebagai string, Anda bisa membuat array seperti ['jan,' feb '... dll] [new Date () .getMonth ()] sebagai ganti ['', 'jan', feb ... dll] [new Date (). getMonth ()] atau ['jan', 'feb' ... etc] [new Date ( ) .getMonth () - 1]
hari dalam sebulan biasanya tidak dinamai sehingga Anda tidak akan membuat array dengan nama untuk itu. Dalam hal ini 1-31 lebih mudah ditangani, jadi Anda harus mengurangi 1 setiap kali ...
sumber