Câu trả lời ngắn:
Đó là một misbehaviuor trong những trình duyệt bạn đang nhắc đến.
Bạn phải tự kiểm tra ngày có định dạng chính xác không.Nhưng nó khá tầm thường, tôi đề nghị phương pháp này:
Chia ngày trong năm y
, tháng m
, ngày d
và tạo đối tượng Date
:
var date = new Date(y, m - 1, d); // note that month is 0 based
Sau đó so sánh các giá trị ban đầu với các giá trị logic thu được bằng cách sử dụng phương pháp Date
:
var isValid = date.getDate() == d &&
date.getMonth() == m-1 &&
date.getFullYear() == y;
Trước khi làm tất cả những điều bạn có thể muốn kiểm tra nếu chuỗi ngày có hiệu lực trong bất kỳ trình duyệt:
Detecting an "invalid date" Date instance in JavaScript
dài câu trả lời:
Firefox (và IE) chấp nhận "2/8888/2016 "dưới dạng định dạng chuỗi chính xác có vẻ là lỗi/hành vi sai trái.
Trong thực tế theo ECMAScript 2015 Language Specification khi Date()
được gọi với một đối số chuỗi duy nhất nên cư xử giống như Date.parse()
http://www.ecma-international.org/ecma-262/6.0/#sec-date-value
Sau
nỗ lực để phân tích định dạng của chuỗi theo các quy tắc (bao gồm cả các năm mở rộng) được gọi trong Định dạng chuỗi ngày giờ (20.3.1.16)
..that được quy định ở đây
http://www.ecma-international.org/ecma-262/6.0/#sec-date-time-string-format
nơi bạn có thể đọc
Cấu trúc của nó như sau: YYYY-MM-DDThh: mm: ss.sssZ
[...]
MM là tháng của năm từ 01 (tháng 1) t o 12 (tháng 12).
DD là ngày của tháng từ 01 đến 31.
Dường như Firefox được giải thích các chuỗi giá trị như khi Date()
được gọi với nhiều tranh cãi.
Từ
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Lưu ý: đâu ngày được gọi là một nhà xây dựng với nhiều hơn một đối số, nếu giá trị lớn hơn phạm vi hợp lý của họ (ví dụ 13 được cung cấp như là giá trị tháng hoặc 70 cho giá trị phút), giá trị liền kề sẽ được điều chỉnh. Ví dụ. Ngày mới (2013, 13, 1) tương đương với Ngày mới (2014, 1, 1), cả hai tạo ngày cho 2014-02-01 (lưu ý rằng tháng là 0-based). Tương tự đối với các giá trị khác: ngày mới (2013, 2, 1, 0, 70) tương đương với ngày mới (2013, 2, 1, 1, 10), cả hai đều tạo ngày cho 2013-03-01T01: 10: 00.
Điều này có thể giải thích như thế nào "2/8888/2016"
biến thành 2040-05-31T22:00:00.000Z
Bạn luôn có thể kiểm tra số bằng cách tách chuỗi và kiểm tra xem '8888' có lớn hơn 31 – Derek
cũng không, bởi vì các vấn đề 'thời gian' trong javascript (cũng khủng khiếp như java, lol), tôi sử dụng: http://momentjs.com/ để thu hẹp khoảng cách. – Derek
@DerekPollard không thành công vào ngày 11 tháng 31 và là phần thưởng bạn có thể viết lôgic năm nhuận của riêng bạn. – djechlin