new Date () hoạt động khác nhau trong Chrome và Firefox


94

Tôi muốn chuyển đổi chuỗi ngày thành Datebằng javascript, hãy sử dụng mã này:

var date = new Date('2013-02-27T17:00:00');
alert(date);

'2013-02-27T17:00:00' là thời gian UTC trong đối tượng JSON từ máy chủ.

Nhưng kết quả của đoạn mã trên là khác nhau giữa Firefox và Chrome:

Firefox trả về:

Wed Feb 27 2013 17:00:00 GMT+0700 (SE Asia Standard Time)

Chrome trở lại:

Thu Feb 28 2013 00:00:00 GMT+0700 (SE Asia Standard Time) 

Đã khác 1 ngày, kết quả chính xác mà tôi mong đợi là kết quả từ Chrome.

Mã demo: http://jsfiddle.net/xHtqa/2/

Làm cách nào để khắc phục sự cố này để có được kết quả giống nhau từ cả hai?


2
Đó là trên cùng một máy tính?
Aaron Digulla

4
@Sandeep điểm chính là Chrome thêm bù múi giờ trong khi Firefox thì không
ngôn ngữ mặc định

3
@CuongLe Bạn có thấy câu hỏi này không: stackoverflow.com/questions/9062863/…
ngôn ngữ mặc định,

1
Date {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)}dành cho tôi trong cả hai (Linux).
marekful

1
Góc của Nitpicker: «Giờ UTC ở định dạng JSON» - Định dạng JSON? Chính xác, một phàn nàn phổ biến về JSON là nó không xác định bất kỳ định dạng ngày nào.
Álvaro González

Câu trả lời:


66

Định dạng chính xác cho UTC sẽ là 2013-02-27T17:00:00Z(Z dành cho Giờ Zulu). Nối Znếu không có để nhận chuỗi ngày giờ UTC chính xác.


2
Cảm ơn. Những công việc này. Nhưng có một bản ghi nói rằng, nó sẽ không được chấp nhận trong tương lai !!!. Bất kỳ ý tưởng xin vui lòng?
Débora

1
cảm ơn rất nhiều, tôi đã ngồi với vấn đề này trong hai ngày, nhưng bài đăng này đã giải quyết mọi thứ.
Piyal George,

30

Vâng, không may là các thuật toán phân tích cú pháp ngày phụ thuộc vào việc triển khai. Từ đặc điểm kỹ thuật củaDate.parse (được sử dụng bởinew Date ):

Chuỗi có thể được hiểu là giờ địa phương, giờ UTC hoặc thời gian ở một số múi giờ khác, tùy thuộc vào nội dung của Chuỗi. Trước tiên, hàm cố gắng phân tích cú pháp định dạng của Chuỗi theo các quy tắc được gọi trong Định dạng Chuỗi Ngày Giờ ( 15.9.1.15 ). Nếu Chuỗi không phù hợp với định dạng đó, hàm có thể trở về bất kỳ định dạng ngày tháng cụ thể cho việc triển khai hoặc triển khai cụ thể.

Để làm cho hàm Datetạo không (có thể) sử dụng múi giờ cục bộ, hãy sử dụng chuỗi ngày giờ với thông tin múi giờ, ví dụ "2013-02-27T17:00:00Z". Tuy nhiên, thật khó để tìm ra định dạng đáng tin cậy được phân tích cú pháp bởi mọi trình duyệt - định dạng ISO không được IE <8 nhận dạng (xem JavaScript: Trình duyệt nào hỗ trợ phân tích cú pháp của Chuỗi ngày ISO-8601 với Date.parse ). Tốt hơn, hãy sử dụng dấu thời gian unix, tức là mili giây kể từ kỷ nguyên unix hoặc sử dụng biểu thức chính quy để chia nhỏ chuỗi thành các phần của nó rồi nạp chúng vào Date.UTC.


2
Nhưng spec (15.9.1.15) thực sự nói: "Giá trị của một múi giờ vắng mặt bù đắp là‘Z’" - vì vậy nó không nên được thực hiện phụ thuộc
sinelaw

12
OK, sửa lại. Có vẻ như lỗi trong thông số ES5.1 - mục đích là để khớp với ISO-8601 trong đó thiếu Z có nghĩa là giờ địa phương (vì vậy Chrome khớp với ES5.1, Firefox & IE khớp với ISO-8601)
sinelaw 12/1213

@sinelaw: Cảm ơn bạn đã nghiên cứu thêm về điểm đó. Tuy nhiên, bất kể thông số kỹ thuật nói gì, các trình duyệt [cũ] vẫn đang làm việc đó theo cách khác :-)
Bergi 12/1213

2
Thật kỳ lạ khi sử dụng Date.Parse so với new Date đã khắc phục sự cố mà tôi gặp phải trong đó Chrome sẽ chuyển đổi ngày thành múi giờ địa phương thay vì coi nó như đã có trong múi giờ địa phương.
KingOfHypocrites

1
@ KingOfHypocrites — hơi lạ khi gọi hàm tạo Ngày bằng một chuỗi được cho là giống như sử dụng Date.parse .
RobG

4

Tôi tìm thấy một điều ở đây. Có vẻ như Bảng điều khiển Thanh tra Firefox gốc có thể có lỗi: Nếu tôi chạy "new Date ()" trong Thanh tra gốc, nó hiển thị một ngày có múi giờ sai, ngôn ngữ GMT, nhưng đang chạy cùng một lệnh trong Bảng điều khiển mở rộng Firebug, ngày hiển thị sử dụng múi giờ chính xác của tôi (GMT-3: 00).


-2

Hãy thử sử dụng moment.js. Nó hoạt động rất tốt và tương tự với tất cả các trình duyệt. đi kèm với nhiều tùy chọn định dạng. sử dụng thời điểm ('ngày'). format ("") thay vì Ngày mới ('ngày')


-2

Nhận thấy rằng FireFox không trả lại kết quả giống như Chrome. Có vẻ như định dạng bạn sử dụng trong kendo.toString cho ngày tháng đã tạo ra sự khác biệt.

Kết quả bảng điều khiển cuối cùng là những gì tôi cần:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.