2012-06-25 28 views
6

Tôi đã thử nghiệm mã sau trong bảng tính firefox và có kết quả thú vị?Javascript ngày mới xử lý khác nhau theo phong cách ngày khác nhau?

var date=new Date("2012-05-12"); 
var date2 = new Date("05/12/2012"); 
date; 
/* 
Fri May 11 2012 17:00:00 GMT-0700 (Pacific Daylight Time) 
*/ 
date2; 
/* 
Sat May 12 2012 00:00:00 GMT-0700 (Pacific Daylight Time) 
*/ 

Hai ngày khác nhau. Rõ ràng điều này là do vấn đề múi giờ. Những gì tôi muốn là kết quả date2. Làm cách nào để công cụ js có thể xử lý chính xác kiểu ngày ISO?

+0

Xóa số 0 đứng đầu trong ví dụ đầu tiên. 'var date = new Date (" 2012-5-12 ");' – j08691

+0

@ j08691 dẫn đến lỗi "Ngày không hợp lệ", ít nhất là trong Firefox. – Pointy

+0

@Pointy - Tốt, tôi đã thử nghiệm trong Chrome. – j08691

Trả lời

2

Tôi nghĩ rằng vấn đề là chuỗi "2012-05-12" được lấy là ngày ISO 8601, trong khi "05/12/2012" là ngày RFC 2822. Ở định dạng ISO, thiếu múi giờ ngụ ý UTC. Vào nửa đêm vào buổi sáng ngày 12 tháng 5, ở California (hoặc bất cứ nơi nào bạn đang có) là 7 giờ chiều tối hôm trước. Tuy nhiên,

Ngày RFC không có múi giờ được phân tích cú pháp theo giả định rằng bạn muốn dấu thời gian cho nửa đêm trong múi giờ cục bộ địa phương của bạn. (Vâng, không nhất thiết phải là múi giờ của bạn; múi giờ của máy tính nơi JavaScript của bạn chạy :-)

Bạn có thể thấy sự khác biệt nếu bạn chuyển các chuỗi đó đến Date.parse().

Định dạng ngày RFC có thể bao gồm múi giờ rõ ràng, nhưng định dạng ISO không thể. (Vâng, nó có thể, nhưng các trình duyệt không chú ý, và dường như IE không xử lý được tất cả.)

chỉnh sửa — đây là một chức năng đơn giản (câm; không kiểm tra lỗi) sẽ cung cấp cho bạn một ngày từ đó hình thức ISO 3 phần:

function isoDate(str) { 
    var rv = null; 
    str.replace(/^(\d\d\d\d)-(\d\d)-(\d\d)$/, function(_, yr, mn, dy) { 
    rv = new Date(parseInt(yr, 10), parseInt(mn, 10) - 1, parseInt(dy, 10)); 
    }); 
    return rv; 
} 
+0

Vâng những gì bạn trả lời thực sự là những gì tôi đang nghĩ. Nhưng bất kỳ giải pháp ...? – NSF

+0

@NSF, bạn có thể phân tích cú pháp định dạng ngày ISO, sau đó xây dựng ngày tháng một cách rõ ràng. Nếu bạn xây dựng một ngày với số, nó phải giả định múi giờ địa phương. – Pointy

0

bằng cách tiêu chuẩn, với Date(), bạn có thể phân tích cú pháp ngày ISO hoặc ngày trong một định dạng thực hiện phụ thuộc, trong một một cách thực hiện phụ thuộc. Để có bất kỳ điều gì đáng tin cậy hơn, hãy sử dụng thư viện phù hợp có thể phân tích cú pháp ngày trong một số định dạng đã biết.

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