2012-06-28 53 views
9

Tôi đang lấy ngày từ một đối tượng JSON theo định dạng 2012-12-31 và cố gắng chuyển đổi nó thành các giá trị thân thiện và xuất nó.vấn đề đối tượng ngày javascript trong Safari và IE

var redeemableDate = item.Deal.RedeemableDate; //this is coming in the form of 2012-12-31 
    var redeemableDate = new Date(redeemableDate); 
    var rdDay = weekday[redeemableDate.getDay()]; //using an array with weekdays 
    var rdDate = redeemableDate.getDate(); 
    var rdMonth = monthNames[redeemableDate.getMonth()]; //using an array with month names 
    var rdYear = redeemableDate.getFullYear(); 

    response.write('Valid ' + rdDay + ' ' + rdDate + ' ' + rdMonth + ' ' + rdYear + ' ONLY'); 

Mọi thứ hoạt động và tìm kiếm trong Firefox và Chrome, nhưng Safari và IE (chỉ được thử nghiệm trên IE8 cho đến nay) không thích nó.

Trong FF và Chrome tôi nhận được mong đợi:

hợp lệ Chủ Nhật 02 Tháng 9 2012 CHỈ

Nhưng trong Safari và IE, tôi nhận được:

trị không xác định NaN không xác định NaN CHỈ

Khi tôi cảnh báo màu đỏ eemableDate sau khi tôi đã đặt nó làm đối tượng Date, Safari trả về 'Invalid Date' và IE trả về 'NaN'. Điều này rõ ràng là nơi vấn đề nằm. Có cách nào tôi có thể nhận được giá trị của tôi vào một đối tượng ngày cho các trình duyệt này?

Trả lời

24

Định dạng ngày yyyy-mm-dd (ISO 8601) không được hỗ trợ trong Safari và IE. Mặc dù nó là một phần của ECMAscript 5, nên nó chỉ là vấn đề thời gian.

Một giải pháp là chuyển ngày đó làm đối số cho Ngày.

var date = "2012-12-31".split("-"); 
var your_date = new Date(date[0], date[1]-1, date[2]); 

Lưu ý rằng tham số tháng bắt đầu từ zero (tháng Giêng), vì vậy bạn phải trừ đi 1 từ giá trị thu được từ chuỗi.

EDIT: Để biết lối tắt, hãy xem câu trả lời bằng joe larson bên dưới.

+0

giải pháp đơn giản và ngọt ngào :) –

+10

'var your_date = new Date (dateString.split (" - "). Join ("/"));' – jlarson

+0

Tốt một Joe! Tôi sẽ cập nhật câu trả lời của mình. – jack

6

Bạn nên phân tích chuỗi ngày tự hỏi:

function dateFromISO(str) { 
    var d = null; 
    str.replace(/^(\d\d\d\d)-(\d\d)-(\d\d)$/, function(_, y, m, d) { 
    d = new Date(parseInt(y, 10), parseInt(m, 10) - 1, parseInt(d, 10)); 
    }); 
    return d; 
} 

redeemableDate = dateFromISO(redeemableDate); 

Ngay cả khi các trình duyệt khác thích những chuỗi ngày, bạn sẽ có vấn đề của họ luôn được hiểu là UTC. Đối với tôi, ví dụ, khi tôi vượt qua chuỗi "2012-12-31" cho Firefox, nó cho tôi biết rằng ngày là 30 tháng 12 năm 2012, bởi vì tôi là 6 giờ sau UTC. Nói cách khác, "2012-12-31" được hiểu là nửa đêm của ngày đó, giờ UTC. Giả sử bạn muốn mọi người trên thế giới nhìn thấy đúng ngày, nếu bạn xây dựng đối tượng Date với các số được giả định là thời gian cục bộ tại máy khách.

1

Phiên bản Internet Explorer cũ hơn (và rõ ràng là phiên bản Safari của bạn) sẽ không phân tích cú pháp chuỗi yyyy-mm-dd, chẳng hạn như new Date('2012-12-31').

Tùy chọn khác là jQuery.datepicker.parseDate(), mặc dù điều đó có thể hơi quá mức.

-1

Trong trường hợp sử dụng dịch vụ web PHP, tôi khuyên bạn nên trả lại ngày của mình bằng cách sử dụng $row['date'] = date('j/n/Y',strtotime($row['date'])); để có chức năng bình thường với safari/ie.

2

Kết hợp jack cắm và phản ứng joe Larson của, đoạn code sau làm việc tốt cho tôi:

 $scope.formatDate = function(date){ 
       var date = date.split("-").join("/"); 
       var dateOut = new Date(date); 
       return dateOut; 
     }; 

hoạt động tốt cho Chrome và Safari ...:)
Cảm ơn Jack và joe larson !!!

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