2012-11-13 35 views
28

Tôi đang làm việc trên ứng dụng iOS dựa trên Phonegap, ứng dụng đã được thực hiện cho Android. Các dòng sau đang hoạt động tốt cho Android nhưng không hoạt động cho iOS. Tại sao?Ngày Javascript không hợp lệ trên iOS

var d = new Date("2015-12-31 00:00:00"); 
console.log(d.getDate() + '. ' + d.getMonth() + ' ' + d.getFullYear(); 

Kết quả dành cho Android:

31.11 2015 

Kết quả trên iOS:

NaN. NaN NaN 

đâu là sự khác biệt đến từ đâu?

Trả lời

65

Chuỗi ngày của bạn không ở định dạng được chỉ định để hoạt động với new Date. Định dạng duy nhất trong thông số là a simplified version of ISO-8601, nhưng chỉ được thêm vào ES5 và do đó hỗ trợ có thể liên lạc và hoạt động. Chuỗi của bạn không có định dạng đó, nhưng nó thực sự rất gần.

Nếu bạn thay đổi không gian để một T, bạn sẽ có trong spec:

var dateString = "2015-12-31 00:00:00"; 
var d = new Date(dateString.replace(' ', 'T')); 

(tôi giả sử bạn không thực sự sử dụng một chuỗi chữ, vì thế mà replace gọi.)

Lưu ý rằng có lỗi trong đặc tả ES5 đã được sửa trong ES2015 (ES6): Điều gì xảy ra khi không có chỉ báo múi giờ trên chuỗi. Trong ISO-8601, không có chỉ báo nào có nghĩa là "giờ địa phương", nhưng đặc điểm kỹ thuật ES5 cho biết nó mặc định là Z (GMT). Họ đã sửa nó trong đặc tả ES2015, nhưng tiếc là một số công cụ JavaScript tuân theo đặc tả ES5 và các công cụ khác theo ISO-8601 (và bây giờ ES2015), vì vậy để hỗ trợ trình duyệt chéo vững chắc, bạn cần bao gồm chỉ báo múi giờ. biết liệu nó sẽ được hiểu là GMT hay giờ địa phương. Bạn được phép sử dụng Z cho GMT hoặc +/- theo sau là HH:MM để bù trừ khoản bù trừ. (Các chữ viết tắt như CST không được phép, vì không có tiêu chuẩn cho chúng.)

Nếu chúng chưa hỗ trợ, mặc dù nó không có giấy tờ, có hỗ trợ phổ quát cho YYYY/MM/DD HH:MM:SS. Vì vậy:

var dateString = "2015-12-31 00:00:00"; 
var d = new Date(dateString.replace(/-/g, '/')); 
+0

Chúc mừng, T đang làm các trick ! –

+1

@PhilippSiegfried: Tuyệt vời, vui mừng đã giúp! –

+1

@NULL: Tôi chưa bao giờ thấy một công cụ JavaScript không hỗ trợ nó.IE6 trở lên làm mọi phiên bản Firefox mà tôi từng thấy, mọi phiên bản Chrome, mọi phiên bản của Opera. ** Nhưng **, người ta phải luôn luôn kiểm tra trên những môi trường mục tiêu (cho dù cái gì đó là "tiêu chuẩn" hay không, thật đáng buồn). –

5

Tôi không thể cho bạn biết lý do. Có lẽ vì iOS không hỗ trợ chức năng Ngày tháng Javascript cũng như Android hoặc hỗ trợ một định dạng khác?

Nhưng tôi có thể cung cấp cho bạn một cách giải quyết:

var s = "2015-12-31 00:00:00".split(" ")[0].split("-"), 
    d = new Date(s[0], s[1], s[2], 0, 0, 0); 

console.log(d); 

var s = "2015-12-31 00:00:00".replace(/[ :]/g, "-").split("-"), 
    d = new Date(s[0], s[1], s[2], s[3], s[4], s[5]); 

console.log(d); 
+0

tôi sẽ thử nó và lấy lại cho bạn – samouray

1

Hãy thử với var d = new Date("2015/12/31 00:00:00"); trình cho tôi.

-1

Cũng

var d = new Date("2015/12/31 00:00:00"); 

công trình đối với tôi :)

Cảm ơn @dda

+0

Không hoạt động cho tôi mà không thay thế khoảng trắng bằng 'T' – zanderwar

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