2011-10-05 32 views
7

Tìm kiếm xác nhận nếu đây là tài liệu hướng dẫn và/hoặc lỗi triển khai thực hiện với phương thức Date.parse của Javascript.Lỗi Javascript Date.parse khi dấu gạch ngang phân tách và bắt đầu với năm

Tài liệu tôi đang đề cập đến là https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/parse và họ nói 'Nếu bạn không chỉ định múi giờ, múi giờ địa phương được giả định.' Tuy nhiên, mã sau đây cho thấy rằng, mặc dù không chỉ định múi giờ, giờ địa phương là không được giả định (nhưng thay vào đó bù đắp múi giờ của tôi đang được áp dụng), nếu chuỗi được chuyển đến Date.parse bắt đầu bằng số 4 đại diện năm chữ số và được phân tách bằng dấu gạch ngang.

var euroStyleDate = '2011-10-04'; 
var amerStyleDate = '10/04/2011'; 
var euroStyleParsed = Date.parse(euroStyleDate); 
var amerStyleParsed = Date.parse(amerStyleDate); 

console.log(euroStyleParsed); //1317686400000 
console.log(amerStyleParsed); //1317700800000 

console.log(new Date(euroStyleParsed)); 
//Date {Mon Oct 03 2011 20:00:00 GMT-0400 (Eastern Daylight Time)} 
console.log(new Date(amerStyleParsed)); 
//Date {Tue Oct 04 2011 00:00:00 GMT-0400 (Eastern Daylight Time)} 

Thậm chí có thể có các trường hợp khác và tôi chắc chắn tôi không phải là người đầu tiên khám phá điều này nếu tôi không chính xác. Vì vậy, ngoài xác nhận, tôi chắc chắn muốn được chỉ vào thông tin chuyên sâu hơn về điều này nếu có ai biết về các liên kết thích hợp.

Tôi đang trải nghiệm điều này trong FF3, Chrome dành cho Windows và tất nhiên chỉ là IE8 đặc biệt thậm chí không có khả năng thực hiện chuyển đổi vào ngày 2011-10-04 bất cứ điều gì: Tôi chỉ nhận được chuỗi trống trong đơn đăng ký của tôi

Cảm ơn trước vì đã có thêm thông tin chi tiết hoặc tài nguyên.

Trả lời

8

* Cập nhật: * Dường như có những tiêu chuẩn khác nhau tại nơi làm việc ở đây:

  1. Các EMCAScript < 5 tiêu chuẩn cho phép đối với số ngày trong standard IETF format, ví dụ Sun Oct 03 2010. Với những ngày này, múi giờ địa phương được giả định.

  2. Trong ECMAScript 5, limited version of the ISO 8601 standard cũng được cho phép, ví dụ: 2010-10-03. Thông số này dường như nói (có lẽ theo ISO 8601?) Trong trường hợp này, múi giờ UTC được giả định nếu múi giờ không được chỉ định.

  3. Tôi chưa tìm thấy thông số nào cho biết Date.parse có thể xử lý mm/dd/yyyy ngày, nhưng trình duyệt của tôi (Chrome 14) có thể rõ ràng và có thể các trình duyệt khác cũng vậy. Điều này dường như tuân theo tiêu chuẩn 1 ở trên, giả sử múi giờ địa phương. Tuy nhiên, tôi không khuyên bạn nên không sử dụng phiên bản này vì có thể phụ thuộc vào trình duyệt (và tôi không biết liệu 10-03-2010 sẽ dẫn đến một ngày khác không nếu tôi đã đặt ngôn ngữ Châu Âu vào trình duyệt của tôi).

Có một số vấn đề với chức năng gốc Date.parse trong hầu hết các phiên dịch - Tôi thường gặp các vấn đề về múi giờ như mô tả bạn mô tả. Vì vậy, nói chung, tôi hoặc sử dụng một thư viện như Datejs hoặc tôi viết các chức năng phân tích cú pháp của riêng tôi. DateTime module of the SIMILE AJAX library có một chức năng ví dụ khá tốt để phân tích các ngày ISO-8601 (những gì bạn đang đề cập đến là euroStyleDate, cộng với một thành phần thời gian tùy chọn).

Khi đặt ngày, tôi thường sử dụng new Date() và sau đó sử dụng các chức năng setUTC*() để đặt các yếu tố ngày khác nhau theo độ chính xác mong muốn của mình. Nó không hoàn hảo, nhưng ít nhất bạn đang đối phó với một múi giờ rõ ràng.

+0

Vâng, chúng tôi đang sử dụng ExtJS và nó rơi trở lại vào ngày phân tích nguồn gốc của trình duyệt :( –

+0

Tôi tin Datejs đè mẹ đẻ 'Date.parse' phương pháp, do đó có thể làm các trick. – nrabinowitz

+0

FYI, thấy tôi cập nhật ở trên - Tôi đã làm một chút nhìn xung quanh các thông số kỹ thuật – nrabinowitz

12

Tôi cũng đã tham gia vào khái niệm này.Đối với bất cứ ai googling "ngày tháng Javascript dấu gạch ngang slashes" như tôi đã được, đây là minh chứng rõ ràng nhất mà tôi có thể nghĩ đến như những gì đang xảy ra ở đây.

Trong ngắn hạn, dấu gạch chéo có nghĩa là múi giờ địa phương và dấu gạch ngang có nghĩa là UTC. Các câu trả lời khác có giải thích về lý do tại sao.

<script type="text/javascript"> 

var 
testB = new Date("2012/02/09"), 
testC = new Date("2012-02-09"); 


alert(testB.toString()); 
alert(testC.toString()); 
alert(testC.toUTCString()); 
</script> 
+0

Và nếu bạn thêm một thời gian trống spec, dấu gạch ngang có nghĩa là thời gian địa phương một lần nữa? Trong chrome: 'new Date ('2014-03-03')' được chuyển đổi thành giờ địa phương từ nửa đêm UTC (-5h đối với tôi), nhưng 'ngày mới ('2014-03-03: 00: 00: 00')' là nửa đêm giờ địa phương. – patricksurry

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