Tanggal minimum dan maksimum

128

Saya bertanya-tanya yang merupakan tanggal minimum dan maksimum yang diizinkan untuk Dateobjek Javascript . Saya menemukan bahwa tanggal minimum adalah sekitar 200000 SM, tetapi saya tidak bisa mendapatkan referensi tentang itu.

Apakah ada yang tahu jawabannya? Saya hanya berharap itu tidak tergantung pada browser.

Jawaban dalam "waktu" (= milidetik dari 1970-01-01 00:00:00 UTC + 00) akan menjadi yang terbaik.

MaxArt
sumber
Untuk jawaban salin / tempel: stackoverflow.com/questions/27093130/…
Kieveli

Jawaban:

177

Dari spec, §15.9.1.1 :

Objek Date berisi Angka yang menunjukkan instan tertentu dalam waktu hingga dalam milidetik. Angka semacam itu disebut nilai waktu. Nilai waktu mungkin juga NaN, yang menunjukkan bahwa objek Date tidak mewakili instan waktu tertentu.

Waktu diukur dalam ECMAScript dalam milidetik sejak 01 Januari, 1970 UTC. Dalam nilai waktu, detik kabisat diabaikan. Diasumsikan ada 86.400.000 milidetik per hari. Nilai ECMAScript Number dapat mewakili semua bilangan bulat dari –9.007.199.254.740.992 hingga 9.007.199.254.740.992; kisaran ini cukup untuk mengukur waktu hingga presisi milidetik untuk setiap instan yang berada dalam sekitar 285.616 tahun, baik maju atau mundur, mulai 01 Januari 1970 UTC.

Rentang aktual dari waktu yang didukung oleh objek Date ECMAS sedikit lebih kecil: tepatnya –100.000.000 hari hingga 100.000.000 hari diukur relatif terhadap tengah malam pada awal 01 Januari, 1970 UTC. Ini memberikan kisaran 8.640.000.000.000.000 milidetik untuk kedua sisi 01 Januari, 1970 UTC.

Saat tepat tengah malam pada awal 01 Januari 1970 UTC diwakili oleh nilai +0.

Paragraf ketiga menjadi yang paling relevan. Berdasarkan paragraf itu, kita bisa mendapatkan tanggal paling awal per spec dari new Date(-8640000000000000), yaitu Selasa, 20 April, 271.821 SM (BCE = Sebelum Era Umum , mis. Tahun -271.821).

TJ Crowder
sumber
1
Ini menginspirasi bidang isMin isMax seperti di .net ... gist.github.com/QueueHammer/cb9bf736b81029d65485fb30ad01918d
QueueHammer
1
Jadi itu sebabnya itu tidak bekerja dengan -9223372036854775808L ... Bahkan setelah saya mengubahnya tanggal, resever kembali positif di luar kisaran nilai.
deadManN
1
Saya tidak tahu apa yang orang keluhkan, ini bekerja dengan baik untuk saya. BTW Saya bertanya-tanya apakah ada cara ini bekerja secara terbalik (yaitu memasukkan tanggal BCE dan mendapatkan detik-detik zaman muncul sebagai int negatif)?
Mark Seagoe
1
@MarkSeagoe - Date.UTC(-271821, 3, 20)kembali -8640000000000000. :-)
TJ Crowder
Tanggal baru ('275760-9-13 05:30:00')
AshTyson
52

Untuk menambah jawaban TJ, melebihi nilai minimum / maksimum menghasilkan Tanggal Tidak Valid.

let maxDate = new Date(8640000000000000);
let minDate = new Date(-8640000000000000);

console.log(new Date(maxDate.getTime()).toString());
console.log(new Date(maxDate.getTime() - 1).toString());
console.log(new Date(maxDate.getTime() + 1).toString()); // Invalid Date

console.log(new Date(minDate.getTime()).toString());
console.log(new Date(minDate.getTime() + 1).toString());
console.log(new Date(minDate.getTime() - 1).toString()); // Invalid Date

Shaun Luttin
sumber
-8

Seperti yang Anda lihat, 01/01/1970 mengembalikan 0, yang berarti ini adalah tanggal serendah mungkin.

new Date('1970-01-01Z00:00:00:000') //returns Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)
new Date('1970-01-01Z00:00:00:000').getTime() //returns 0
new Date('1970-01-01Z00:00:00:001').getTime() //returns 1
ColacX
sumber
9
Apa gunanya jawaban Anda? Bagaimana tanggapannya terhadap pertanyaan awal?
MaxArt
1/1/1970 bukan tanggal serendah mungkin. Anda dapat melewati angka negatif untuk mendapatkan tanggal sebelum 1/1/1970.
inejwstine