Mengapa Javascript getYear () mengembalikan 108?

95

Mengapa javascript ini mengembalikan 108, bukan 2008? hari dan bulannya benar, tetapi tahunnya tidak?

myDate = new Date();
year = myDate.getYear();

tahun = 108?

ctrlShiftBryan
sumber
29
Oh, dosa-dosa yang kami lakukan mencoba melewati Y2K.
DGentry
3
year = myDate.getFullYear() % 100;
Andrew Larsson

Jawaban:

128

Ini adalah masalah Y2K , hanya tahun sejak 1900 yang dihitung.

Ada potensi masalah kompatibilitas sekarang yang getYear()sudah tidak digunakan lagi dan mendukung getFullYear()- dari quirksmode :

Untuk membuat masalah ini lebih kompleks, date.getYear () sudah tidak digunakan lagi sekarang dan Anda harus menggunakan date.getFullYear (), yang, pada gilirannya, tidak didukung oleh browser lama. Jika berhasil, bagaimanapun, harus selalu memberikan setahun penuh, yaitu. 2000, bukan 100.

Browser Anda memberikan tahun-tahun berikut dengan dua metode ini:

* The year according to getYear(): 108
* The year according to getFullYear(): 2008

Ada juga perbedaan implementasi antara Internet Explorer dan Firefox, karena implementasi IE getYear()diubah menjadi seperti getFullYear()- dari IBM :

Sesuai spesifikasi ECMAScript, getYear mengembalikan tahun minus 1900, awalnya dimaksudkan untuk mengembalikan "98" untuk 1998. getYear tidak digunakan lagi di ECMAScript Versi 3 dan diganti dengan getFullYear ().

Internet Explorer mengubah getYear () agar berfungsi seperti getFullYear () dan membuatnya sesuai dengan Y2k, sementara Mozilla mempertahankan perilaku standar.

ConroyP
sumber
25

Karena getFullYear tidak berfungsi di browser lama, Anda dapat menggunakan sesuatu seperti ini:

Date.prototype.getRealYear = function() 
{ 
    if(this.getFullYear)
        return this.getFullYear();
    else
        return this.getYear() + 1900; 
};

Prototipe JavaScript dapat digunakan untuk memperluas objek yang ada, seperti metode ekstensi C #. Sekarang, kita bisa melakukan ini;

var myDate = new Date();
myDate.getRealYear();
// Outputs 2008
FlySwat
sumber
7
Mungkin seperti Date.prototype.getRealYear = Date.prototype.getFullYear? Date.prototype.getFullYear: function () {kembalikan this.getYear () + 1900; };
Valentin Golev
12

Periksa dokumennya. Ini bukan masalah Y2K - ini bukan masalah Y2K! Keputusan ini awalnya dibuat dalam C dan disalin ke Perl, tampaknya JavaScript, dan mungkin beberapa bahasa lain. Dahulu kala itu tampaknya masih diinginkan untuk menggunakan tahun dua digit, tetapi luar biasa siapa pun yang merancang antarmuka itu memiliki cukup pemikiran untuk menyadari bahwa mereka perlu memikirkan tentang apa yang akan terjadi pada tahun 2000 dan seterusnya, jadi daripada hanya memberikan dua terakhir digit, mereka memberikan jumlah tahun sejak 1900. Anda bisa menggunakan dua digit, jika Anda sedang terburu-buru atau ingin mengambil risiko. Atau jika Anda ingin program Anda terus berjalan, Anda dapat menambahkan 100 ke hasilnya dan menggunakan tahun empat digit penuh.

Saya ingat pertama kali saya melakukan manipulasi tanggal di Perl. Anehnya saya membaca dokumentasinya . Ternyata hal tersebut bukanlah hal yang biasa. Satu atau dua tahun kemudian saya dipanggil ke kantor pada tanggal 31 Desember 1999 untuk memperbaiki bug yang telah ditemukan pada menit terakhir dalam beberapa kode Perl kontrak, hal-hal yang tidak pernah ada hubungannya dengan saya. Masalahnya persis seperti ini: panggilan tanggal standar menghasilkan tahun sejak 1900, dan pemrogram memperlakukannya sebagai tahun dua digit. (Mereka berasumsi bahwa mereka akan mendapatkan "00" pada tahun 2000.) Sebagai programmer muda yang tidak berpengalaman, saya heran bahwa kami telah membayar begitu banyak ekstra untuk pekerjaan "profesional", dan orang-orang itu bahkan tidak mau repot-repot membaca dokumentasi. Itu adalah awal dari kekecewaan selama bertahun-tahun; sekarang aku sudah tua dan sinis. :)

Pada tahun 2000, konferensi Perl YAPC tahunan disebut sebagai "YAPC 19100" untuk menghormati non-bug yang sering dilaporkan ini.

Saat ini, setidaknya di dunia Perl, lebih masuk akal untuk menggunakan modul standar untuk penanganan tanggal, yang menggunakan tahun empat digit yang sebenarnya. Tidak yakin apa yang mungkin tersedia untuk JavaScript.

cakrawala
sumber
1
hehe ... mengingatkan saya pada kartun Dilbert ... "pernahkah kamu membaca cerita tentang pria spanyol bernama Manual?" ;)
Adhip Gupta
Saya yakin @skiphoppy berarti menambahkan 1900 ke getYear () akan menghasilkan setahun penuh yang diinginkan. Ini mirip dengan menambahkan +1 ke getMonth () saat mengambil angka bulan yang dapat dibaca manusia. Contoh: var ts = new Date (); var fullYear = (ts.getYear () + 1900); Tetapi menggunakan getFullYear () lebih disukai. Contoh: var fullYear = new Date (). GetFullYear ();
berulang
6

Ini harus mengembalikan jumlah tahun sejak tahun 1900.

Jeremy Ruten
sumber
4

menggunakan date.getFullYear() .

Ini (seperti yang ditunjukkan dengan benar di tempat lain) adalah hal Y2K. Netscape (ditulis sebelum 2000) aslinya dikembalikan, misalnya 98dari getYear(). Daripada kembali ke 00, itu malah dikembalikan100 untuk tahun 2000. Kemudian browser lain datang dan melakukannya secara berbeda, dan semua orang tidak senang karena ketidakcocokan memerintah.

Kemudian browser didukung getFullYearsebagai metode standar untuk mengembalikan tahun lengkap.

Dan
sumber
3

Pertanyaan ini sangat kuno sehingga membuat saya menangis dengan nostalgia akan hari-hari dotcom!

Benar, Date.getYear () mengembalikan jumlah tahun sejak 1900, seperti Perl's localtime (). Orang bertanya-tanya mengapa bahasa yang dirancang pada tahun 1990-an tidak memperhitungkan pergantian abad, tetapi apa yang bisa saya katakan? Anda harus berada di sana. Ini agak masuk akal pada saat itu (seperti pets.com lakukan).

Sebelum tahun 2000, seseorang mungkin tergoda untuk memperbaiki bug ini dengan menambahkan "19" ke hasil getYear () yang menghasilkan "bug tahun 19100" . Orang lain telah menjawab pertanyaan ini dengan cukup (tambahkan 1900 ke hasil getDate ()).

Mungkin buku yang Anda baca tentang JavaScript agak tua?

Terima kasih atas ledakan di masa lalu!

john
sumber
Alasan bahasa (Perl) tidak memperhitungkannya adalah karena ia secara membabi buta menyalin keputusan desain C yang telah dibuat jauh sebelumnya. (20 tahun?)
skiphoppy
Saya memberi keteduhan pada JavaScript, bukan Perl. Perl sering mengekspos rutinitas C yang mendasarinya secara langsung. Seperti yang Anda katakan, ini adalah produk pada masanya. JS, yang dirancang setidaknya satu dekade kemudian, bisa saja mengambil jalan yang berbeda.
john
2

Anda harus, seperti yang ditunjukkan, jangan pernah menggunakan getYear(), melainkan gunakangetFullYear() .

Namun, ceritanya tidak sesederhana "IE mengimplementasikan GetYear()seperti getFullYear(). Opera dan IE saat ini memperlakukan getYear()seperti getYear()yang semula ditentukan untuk tanggal sebelum tahun 2000, tetapi akan memperlakukannya sebagaigetFullYear() untuk tanggal setelah 2000, sementara webkit dan Firefox tetap dengan perilaku lama

Ini menghasilkan 99 di semua browser:

javascript:alert(new Date(917823600000).getYear());

Ini menghasilkan 108 di FF / WebKit, dan 2008 di Opera / IE:

javascript:alert(new Date().getYear());
Arve
sumber
1

Itu bodoh. Itu tanggal ke hari sebelum Y2K , dan sekarang hanya mengembalikan jumlah tahun sejak 1900 untuk alasan warisan. Gunakan getFullYear () untuk mendapatkan tahun sebenarnya.

joelhardi
sumber
1

Saya menggunakan date.getUTCFullYear(); bekerja tanpa masalah.

D3vito
sumber
0

Angka yang Anda dapatkan adalah jumlah tahun sejak 1900. Jangan tanya kenapa ..

Nils Pipenbrinck
sumber
0

Seperti orang lain berkata, itu mengembalikan jumlah tahun sejak tahun 1900. Alasan mengapa hal itu adalah bahwa ketika JavaScript diciptakan pada pertengahan 90-an, perilaku yang baik nyaman dan konsisten dengan API tanggal-waktu dalam bahasa lain. Khususnya C. Dan, tentu saja, setelah API dibuat, mereka tidak dapat mengubahnya karena alasan kompatibilitas ke belakang.

pengguna11318
sumber
0

BTW, browser yang berbeda mungkin memberikan hasil yang berbeda, jadi lebih baik lewati fungsi ini sama sekali dan dan gunakan getFullYear () selalu.

Milan Babuškov
sumber
0

var date_object = Tanggal baru (); var year = date_object.getYear (); if (tahun <2000) {year = year + 1900; } // kamu akan mendapatkan setahun penuh ....


sumber
-1

itu kembali 4 digit tahun - 1900, yang mungkin dingin 9+ tahun yang lalu, tapi cukup terbelakang sekarang. Java.util.Date dari Java juga melakukan ini.

pengguna17163
sumber