2013-12-11 13 views
7

Nếu tôi cố gắng phân tích một ngày với cú pháp này:quyết tâm không nhất quán của ngày có hiệu lực sử dụng Date.parse

var date1 = new Date(Date.parse('2013' + '/' + '02' + '/' + '29')); 

nó sẽ trở lại ngày 01 tháng 3 năm 2013.

var date1 = new Date(Date.parse('2013' + '/' + '02' + '/' + '30')); 

nó sẽ trở lại 02 tháng 3 năm 2013 Nhưng nếu tôi làm

var date1 = new Date(Date.parse('2013' + '/' + '02' + '/' + '33')); 

nó sẽ trả về Invalid Date.

Quan điểm của tôi là tại sao không phải tất cả các ngày này đều trả về Invalid Date?

+1

@Qantas 94 Nặng: cảm ơn bạn đã chỉnh sửa. ;-) –

+1

Không sao đâu - không cần phải cảm ơn tôi;) –

Trả lời

3

Chỉ có định dạng duy nhất là Date.parse để phân tích cú pháp chính xác là đơn giản hóa tiêu chuẩn ISO 8601. Bạn có thể đọc thêm chi tiết về định dạng chính xác trong ecma specification.

Bất kỳ định dạng nào khác mà Date.parse nhận ra là ngày cụ thể là triển khai. Định dạng bạn đã đề cập không phải là một phần của tiêu chuẩn ở trên, do đó, mỗi triển khai có thể cung cấp bất kỳ kết quả nào cho nó mà họ mong muốn.

Điều đó xảy ra khi bạn chuyển vào những gì trông giống như một ngày trong tháng lớn hơn 31, trình phân tích cú pháp sẽ coi đó là chuỗi không hợp lệ, vì vậy nó sẽ trả về NaN. Kiểm tra xem ngày tháng có hợp lệ không nhiều khó khăn do các vấn đề khác nhau với bất thường hàng tháng, năm nhuận, số giây mất tích, múi giờ, vv, do đó, việc đặt tất cả logic đó trong trình phân tích cú pháp không được bảo đảm. Với ngày có vẻ hợp lệ, nó được chuyển đổi thành một dấu thời gian và được trả về bởi Date.parse và tại thời điểm đó ngày tháng mới() có một cái gì đó để làm việc với.

Kết luận là sử dụng định dạng không chuẩn với Date.parse không đáng tin cậy và cần tránh nếu có thể.

1

Vì giá trị trong ngày có thể giữ tới số 31.

+2

Tôi không nghĩ điều này * thực sự * trả lời câu hỏi.Tôi đã có thể dự kiến ​​'2013/02/30' là ngày không hợp lệ – CodingIntrigue

+0

vì vậy, làm cách nào để kiểm tra ngày hợp lệ mà không có "Năm" theo năm nhuận? –

3

Thiết kế khủng khiếp? (hoặc đúng hơn là thực hiện các tiêu chuẩn)

Luôn có vấn đề khi làm việc với JavaScript ngày đối tượng chéo trình duyệt (trình duyệt có xu hướng thực hiện các tiêu chuẩn theo cách riêng của họ). Tôi có thể giữ cho bạn bận rộn trong một thời gian với những câu chuyện kinh dị/vấn đề tôi đã gặp trong những năm qua - đó là lý do tại sao chúng tôi đã có thư viện tốt đẹp như DateJs. Ví dụ này (ví dụ của bạn) thậm chí không phải là hành vi của TẤT CẢ các trình duyệt, đã thử nghiệm nó trong IE9 và đoạn mã cuối cùng trả về ngày 5 tháng 3 năm 2013 (như mong đợi từ hai đoạn mã trước khác), trong Chrome đoạn cuối cùng trả về một ngày không hợp lệ.

Nhưng có, tôi đồng ý rằng tại sẽ có ý nghĩa hơn nếu cả ba trở về ngày không hợp lệ.

Cập nhật (2015/1/8)

Nó có vẻ như DateJs không còn thực sự tích cực được duy trì? Các bạn có thể muốn xem xét sử dụng MomentJs làm phương án thay thế.

+0

Wow..Lần đầu mối. Tôi thậm chí không biết có thư viện DateJs –

Các vấn đề liên quan