วันที่ต่ำสุดและสูงสุด


129

ฉันสงสัยว่าวันที่ต่ำสุดและสูงสุดที่อนุญาตสำหรับDateวัตถุJavascript ฉันพบว่าวันที่ต่ำสุดคือ 200000 ปีก่อนคริสตกาล แต่ฉันไม่ได้รับข้อมูลอ้างอิงใด ๆ

มีใครรู้คำตอบไหม ฉันหวังว่ามันจะไม่ขึ้นอยู่กับเบราว์เซอร์

คำตอบใน "ช่วงเวลา" (= มิลลิวินาทีจาก 1970-01-01 00:00:00 UTC + 00) จะดีที่สุด


สำหรับคำตอบคัดลอก / วาง: stackoverflow.com/questions/27093130/…
Kieveli

คำตอบ:


178

จากข้อมูลจำเพาะ§15.9.1.1 :

ออบเจ็กต์ Date มีตัวเลขที่ระบุช่วงเวลาที่เฉพาะเจาะจงภายในมิลลิวินาที ตัวเลขดังกล่าวเรียกว่าค่าเวลา ค่าเวลาอาจเป็น NaN เช่นกันซึ่งแสดงว่าวัตถุ Date ไม่ได้แสดงถึงช่วงเวลาที่เฉพาะเจาะจง

เวลาวัดเป็น ECMAScript ในหน่วยมิลลิวินาทีตั้งแต่ 1 มกราคม 1970 UTC ค่าเวลาอธิกวินาทีจะถูกละเว้น สันนิษฐานว่ามีปริมาณ 86,400,000 มิลลิวินาทีต่อวัน ค่า ECMAScript Number สามารถแสดงจำนวนเต็มทั้งหมดตั้งแต่ –9,007,199,254,740,992 ถึง 9,007,199,254,740,992; ช่วงนี้เพียงพอที่จะวัดเวลาเป็นความแม่นยำระดับมิลลิวินาทีสำหรับทันทีใด ๆ ที่อยู่ภายในประมาณ 285,616 ปีไม่ว่าจะเดินหน้าหรือถอยหลังตั้งแต่วันที่ 1 มกราคม 1970 UTC

ช่วงเวลาจริงที่รองรับโดยออบเจ็กต์ ECMAScript Date มีขนาดเล็กกว่าเล็กน้อย: เท่ากับ –100,000,000 วันถึง 100,000,000 วันที่วัดเทียบกับเที่ยงคืน ณ วันที่ 1 มกราคม 1970 UTC ค่านี้ให้ช่วง 8,640,000,000,000,000 มิลลิวินาทีสำหรับด้านใดด้านหนึ่งของวันที่ 01 มกราคม 1970 UTC

ช่วงเวลาเที่ยงคืนของวันที่ 1 มกราคม 1970 UTC แสดงด้วยค่า +0

ย่อหน้าที่สามมีความเกี่ยวข้องมากที่สุด จากย่อหน้านั้นเราจะได้วันที่เร็วที่สุดที่แม่นยำที่สุดต่อข้อมูลจำเพาะnew Date(-8640000000000000)ซึ่งก็คือวันอังคารที่ 20 เมษายน 271,821 ก่อนคริสตศักราช (คริสตศักราช = ก่อนศักราชทั่วไปเช่นปี -271,821)


1
สิ่งนี้เป็นแรงบันดาลใจให้ฟิลด์ isMin isMax เช่นใน. net ... gist.github.com/QueueHammer/cb9bf736b81029d65485fb30ad01918d
QueueHammer

1
นั่นเป็นเหตุผลว่าทำไมมันถึงใช้ไม่ได้กับ -9223372036854775808L ... แม้ว่าหลังจากที่ฉันเปลี่ยนเป็นวันที่ตัวตรวจสอบกลับส่งคืนค่าบวกนอกช่วง
deadManN

1
ฉันไม่รู้ว่ามีคนบ่นเรื่องอะไรวิธีนี้ใช้ได้ดีสำหรับฉัน BTW ฉันสงสัยว่ามีวิธีใดบ้างที่ทำงานในทางกลับกัน (เช่นป้อนวันที่คริสตศักราชและทำให้วินาทีที่โผล่ออกมาเป็น int เชิงลบ)?
Mark Seagoe

1
@MarkSeagoe - ผลตอบแทนDate.UTC(-271821, 3, 20) -8640000000000000:-)
TJ Crowder

new Date ('275760-9-13 05:30:00')
AshTyson

52

หากต้องการเพิ่มคำตอบของ TJ การเกินค่าต่ำสุด / สูงสุดจะสร้างวันที่ไม่ถูกต้อง

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


-8

อย่างที่คุณเห็น 01/01/1970 ส่งกลับ 0 ซึ่งหมายความว่าเป็นวันที่ต่ำสุดที่เป็นไปได้

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

9
คำตอบของคุณคืออะไร? ตอบคำถามเดิมอย่างไร
MaxArt

1/1/1970 ไม่ใช่วันที่ต่ำสุดที่เป็นไปได้ คุณสามารถส่งจำนวนลบเพื่อรับวันที่ก่อน 1/1/1970
Injwstine
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.