Ngày tối thiểu và tối đa


128

Tôi đã tự hỏi đâu là ngày tối thiểu và tối đa được phép cho một Dateđối tượng Javascript . Tôi thấy rằng ngày tối thiểu là khoảng 200000 trước Công nguyên, nhưng tôi không thể có bất kỳ tài liệu tham khảo nào về nó.

Có ai biết câu trả lời không? Tôi chỉ hy vọng rằng nó không phụ thuộc vào trình duyệt.

Câu trả lời trong "thời gian kỷ nguyên" (= mili giây từ 1970-01-01 00:00:00 UTC + 00) sẽ là tốt nhất.


Đối với câu trả lời sao chép / dán: stackoverflow.com/questions/27093130/ từ
Kieveli

Câu trả lời:


177

Từ thông số kỹ thuật, §15.9.1.1 :

Một đối tượng Date chứa một Số chỉ thời gian tức thời cụ thể trong một mili giây. Số như vậy được gọi là giá trị thời gian. Giá trị thời gian cũng có thể là NaN, chỉ ra rằng đối tượng Date không đại diện cho một thời điểm cụ thể.

Thời gian được đo bằng ECMAScript tính bằng mili giây kể từ ngày 1 tháng 1 năm 1970 UTC. Trong thời gian giá trị giây nhuận được bỏ qua. Người ta cho rằng có chính xác 86.400.000 mili giây mỗi ngày. Các giá trị Số ECMAScript có thể đại diện cho tất cả các số nguyên từ cấp9.007.199.254.740,992 đến 9,007,199,254,740,992; phạm vi này đủ để đo thời gian chính xác đến mili giây cho bất kỳ tức thời nào trong khoảng 285.616 năm, dù tiến hay lùi, từ ngày 1 tháng 1 năm 1970 UTC.

Phạm vi thời gian thực tế được hỗ trợ bởi các đối tượng Ngày ECMAScript nhỏ hơn một chút: chính xác 100.000.000 ngày đến 100.000.000 ngày được đo tương ứng với nửa đêm vào đầu ngày 1 tháng 1 năm 1970 UTC. Điều này mang lại phạm vi 8,640.000.000.000.000 mili giây cho một trong hai ngày 01 tháng 1 năm 1970 UTC.

Thời điểm chính xác của nửa đêm vào đầu ngày 1 tháng 1 năm 1970 UTC được biểu thị bằng giá trị +0.

Đoạn thứ ba có liên quan nhất. Dựa trên đoạn đó, chúng ta có thể có được ngày chính xác sớm nhất cho mỗi thông số từ new Date(-8640000000000000), đó là Thứ Ba, ngày 20 tháng 4, 271.821 BCE (BCE = Trước kỷ nguyên chung , ví dụ: năm -271.821).


1
Điều này đã truyền cảm hứng cho một trường isMin isMax như trong .net ... gist.github.com/Queue Hammer / cb9bf736b81029d65485fb30ad01918d
Queueoutmer

1
Vì vậy, đó là lý do tại sao nó không hoạt động với -9223372036854775808L ... Ngay cả sau khi tôi thay đổi nó cho đến ngày, resever trả về giá trị dương ngoài phạm vi.
deadManN

1
Tôi không biết mọi người đang phàn nàn về điều gì, điều này hoạt động tốt với tôi. BTW Tôi tự hỏi liệu có cách nào điều này hoạt động ngược lại (tức là nhập ngày BCE và nhận được các giây kỷ nguyên xuất hiện dưới dạng int âm)?
Đánh dấu Seagoe

1
@MarkSeagoe - Date.UTC(-271821, 3, 20)trả lại -8640000000000000. :-)
TJ Crowder

Ngày mới ('275760-9-13 05:30:00')
AshTyson

52

Để tăng câu trả lời của TJ, vượt quá giá trị tối thiểu / tối đa sẽ tạo ra Ngày không hợp lệ.

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

Như bạn có thể thấy, 01/01/1970 trả về 0, có nghĩa là ngày thấp nhất có thể.

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
Điểm của câu trả lời của bạn là gì? Làm thế nào để nó trả lời cho câu hỏi ban đầu?
MaxArt

1/1/1970 không phải là ngày thấp nhất có thể. Bạn có thể vượt qua số âm để có được một ngày trước ngày 1/1/1970.
inejwstine
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.