2011-11-11 32 views
8

Tôi đang sử dụng hàm tạo Ngày (chuỗi) Javascript với định dạng ngày là "yyyy-mm-dd". Các nhà xây dựng hoạt động tốt trong IE 9 và Firefox, trừ khi các ứng dụng đang chạy trên máy ảo thử nghiệm của chúng tôi đang chạy IIS. Nếu nó trên VM, trong IE 9 nó trả về 'NaN', nhưng vẫn hoạt động bình thường trong Firefox.Ngày Javascript (dateString) trả về NaN trên máy chủ và trình duyệt cụ thể

var dateAsString = "2011-11-09"; 
    var dateCreated = new Date(dateAsString); 

Tôi đã giả định rằng máy chủ không liên quan gì đến Javascript phía máy khách. Bất kỳ đề xuất?

+0

Chắc chắn rằng máy chủ không có gì để làm với Javascript phía máy khách khi khách hàng (người truy cập trang web) chạy mã đó, không phải máy chủ. – jakx

+0

@jakx Tôi biết, đó là lý do tại sao tôi bị nhầm lẫn bởi điều này. – Gagege

+2

Kiểm tra chế độ tài liệu trong các công cụ phát triển của IE (F12) trên cả hai máy chủ. Tôi nghi ngờ họ khác nhau. – Phrogz

Trả lời

2

Tôi khuyên bạn nên thử một hình thức phân tích cú pháp ngày tháng đáng tin cậy hơn. Ví dụ dưới đây sử dụng setFullYear(). IE có tạo ra kết quả khác với mã dưới đây không?

/**Parses string formatted as YYYY-MM-DD to a Date object. 
    * If the supplied string does not match the format, an 
    * invalid Date (value NaN) is returned. 
    * @param {string} dateStringInRange format YYYY-MM-DD, with year in 
    * range of 0000-9999, inclusive. 
    * @return {Date} Date object representing the string. 
    */ 
    function parseISO8601(dateStringInRange) { 
    var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)\s*$/, 
     date = new Date(NaN), month, 
     parts = isoExp.exec(dateStringInRange); 

    if(parts) { 
     month = +parts[2]; 
     date.setFullYear(parts[1], month - 1, parts[3]); 
     if(month != date.getMonth() + 1) { 
     date.setTime(NaN); 
     } 
    } 
    return date; 
    } 

Nguồn: http://jibbering.com/faq/#parseDate

+0

Điều đó có hiệu quả. Điều này vẫn còn cản trở tôi mặc dù. Máy phục vụ lên JS không quan trọng đúng không? Mã của tôi làm việc trong IE khi tôi chạy nó trên localhost. – Gagege

+0

Tôi đã có một ngày cũng bao gồm thời gian và khu vực (chỉ cần ngày). Tôi đã chỉnh sửa regex của bạn trên dòng 2 và xóa cả^và $ khỏi nó. Nếu không, làm việc như một say mê. –

3

Đó là vì định dạng ngày. Vì một số lý do, IE và Safari bị vấp phải với yyyy-mm-dd. Sử dụng định dạng ngày khác và bạn sẽ được đặt tất cả.

Nó nói về ở đây:
http://biostall.com/javascript-new-date-returning-nan-in-ie-or-invalid-date-in-safari

+0

Nhưng, vấn đề thực sự là nó làm việc trong IE khi tôi chạy các ứng dụng trên localhost của tôi (Visual Studio server). Nó không hoạt động trong IE khi nó ở trên một máy chủ khác. – Gagege

+0

Máy chủ khác có cài đặt phiên bản IE khác không? –

+0

Không, hai tab khác nhau mở trong cùng một IE 9. Mã JS giống nhau, hành vi khác nhau. – Gagege

8

Chỉ cần sử dụng chéo thay vì dấu gạch nối nếu bạn có thể.


EDIT: làm rõ được mở rộng ...

Định dạng chuẩn ISO 8601 sử dụng gạch nối như một dấu phân cách ngày. Câu trả lời của tôi không có nghĩa là bạn không cần tuân thủ các tiêu chuẩn. Bạn chỉ có thể sử dụng dấu gạch chéo cho hàm tạo Date nếu cần.

+1

Điều đó chắc chắn có vẻ hấp dẫn. Bạn có thể xác nhận rằng tất cả các trình duyệt chính khác cũng hỗ trợ định dạng được phân tách bằng dấu gạch chéo không? – Wytze

+0

Có tất cả chúng làm: http://jsfiddle.net/AwuPn/1/ –

+0

Thật tuyệt vời, cảm ơn! – Wytze

9

Và đối với những người trong chúng ta những người muốn biết cách để thay thế dấu gạch nối (aka dấu gạch ngang) với dấu gạch chéo:

new Date(dashToSlash(string)); 

đó sử dụng chức năng này:

function dashToSlash(string){ 
    var response = string.replace(/-/g,"/"); 
    //The slash-g bit says: do this more than once 
    return response; 
} 

Trong trường hợp của tôi nó nhiều dễ dàng hơn để chuyển đổi dấu gạch nối thành dấu gạch chéo một cách có chọn lọc (chỉ ở nơi cần có hàm Date()) thay thế định dạng ngày ở mọi nơi trong mã của tôi.

Lưu ý: bạn thực sự cần xác định biến 'phản hồi' riêng và gán giá trị của kết quả hoạt động thay thế. Nếu không, chuỗi sẽ được trả về không bị thay đổi trong Chrome. Đó không phải là một vấn đề lớn, vì Chrome không có vấn đề với chuỗi ngày tháng được gạch nối để bắt đầu. Nhưng vẫn ...

+0

'bạn thực sự cần phải xác định một biến 'phản ứng' riêng biệt và gán cho nó giá trị của kết quả hoạt động thay thế. Nếu bạn không, chuỗi được trả về không bị thay đổi trong Chrome.' cái gì? –

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