2013-03-11 40 views
87

Tôi đang sử dụng Moment.js để phân tích cú pháp và định dạng ngày trong ứng dụng web của mình. Là một phần của đối tượng JSON, máy chủ phụ trợ của tôi gửi ngày dưới dạng một số mili giây từ kỷ nguyên UTC (bù đắp Unix).Moment.js: Ngày định dạng trong một múi giờ cụ thể

Parsing ngày trong một múi giờ cụ thể rất dễ dàng - chỉ cần thêm các nhận dạng múi giờ RFC 822 đến hết chuỗi trước khi phân tích cú pháp:

// response varies according to your timezone 
moment('3/11/2012 13:00').utc().format("MM/DD HH:mm") 

// problem solved, always "03/11 17:00" 
moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm") 

Nhưng làm thế nào để định dạng một ngày trong một specifc múi giờ? Tôi muốn kết quả nhất quán bất kể thời gian hiện tại của trình duyệt, nhưng tôi không muốn hiển thị ngày trong UTC.

+2

Hiện tại, chúng chưa hỗ trợ điều này, nhưng chúng đang thực hiện. https://github.com/timrwood/moment/pull/671 – Ben

+4

Điều này chỉ hoạt động. Nếu bạn vượt qua thời điểm một chuỗi thời gian bao gồm độ lệch mong muốn, thì nó sẽ giữ lại độ lệch đó và hiển thị thời gian cục bộ như đã cho, thay vì tự động điều chỉnh theo thời gian trình duyệt cục bộ. Nếu tôi muốn nó để điều chỉnh thời gian trình duyệt địa phương, sau đó tôi muốn cung cấp cho nó một thời gian UTC thay vì rõ ràng cho nó một bù đắp để sử dụng. Ý tôi là ... tôi cho nó một sự bù đắp rõ ràng, tại sao nó cơ bản ăn nó và làm việc chuyển đổi riêng của nó sang các trình duyệt được bù đắp. Thiết kế khủng khiếp. – Triynko

+0

@Triynko bù đắp phải được tiết kiệm ánh sáng ban ngày, vì vậy, nó không phải lúc nào cũng hoạt động như mong đợi. – pinkpanther

Trả lời

132

Như được chỉ ra trong Manto's answer, .utcOffset() là phương pháp được ưu tiên là Moment 2.9.0. Hàm này sử dụng giá trị chênh lệch thực từ UTC, không phải khoản bù trừ ngược (ví dụ: -240 đối với New York trong DST). Bù đắp các chuỗi như "0400" làm việc giống như trước:

// always "2013-05-23 00:55" 
moment(1369266934311).utcOffset(60).format('YYYY-MM-DD HH:mm') 
moment(1369266934311).utcOffset('+0100').format('YYYY-MM-DD HH:mm') 

Càng lớn tuổi .zone() as a setter được phản trong Moment.js 2.9.0. Nó chấp nhận một chuỗi chứa mã định danh múi giờ (ví dụ: "-0400" hoặc "-04: 00" trong -4 giờ) hoặc số đại diện cho phút sau UTC (ví dụ: 240 cho New York trong DST).

// always "2013-05-23 00:55" 
moment(1369266934311).zone(-60).format('YYYY-MM-DD HH:mm') 
moment(1369266934311).zone('+0100').format('YYYY-MM-DD HH:mm') 

Để làm việc với các múi giờ được đặt tên thay vì offsets số, bao gồm Moment Timezone và sử dụng .tz() thay vì:

// determines the correct offset for America/Phoenix at the given moment 
// always "2013-05-22 16:55" 
moment(1369266934311).tz('America/Phoenix').format('YYYY-MM-DD HH:mm') 
+0

Tôi đã gặp rắc rối với điều này thông qua một "TypeError: Object 240 không có lỗi 'định dạng' phương pháp. Tôi nhận ra khu vực chỉ có sẵn như là một setter trên phiên bản 2.1.0 và lên của Moment.js (và tôi đã ở trên một phiên bản cũ). Cảm ơn! –

+0

Bạn cũng có thể chuyển múi giờ "America/Phoenix". –

+0

Có thời điểm nào để sử dụng múi giờ trình duyệt của người dùng không? – ebi

4

Tôi đã có cùng một vấn đề với Moment.js. Tôi đã cài đặt múi giờ thời gian, nhưng vấn đề không được giải quyết. Sau đó, tôi đã làm những gì ở đây nó tiếp xúc, thiết lập múi giờ và nó hoạt động như một nét duyên dáng:

moment(new Date({your_date})).zone("+08:00") 

Cảm ơn rất nhiều!

+9

Bạn không nên sử dụng hàm tạo 'new Date()'. Moment cung cấp mọi thứ bạn cần để phân tích ngày. Xem tài liệu [Parsing] (http://momentjs.com/docs/#/parsing/). – user113215

+0

Có, nhưng nếu tôi không làm điều đó, tôi nhận được cảnh báo từ Moment, rằng nó không được chấp nhận như thế – facundofarias

+4

Cảnh báo có nghĩa là Moment đang quay trở lại chính xác những gì bạn đang làm (sử dụng 'new Date () 'nội bộ), nhưng điều này là [không nhất quán giữa các trình duyệt] (http://dygraphs.com/date-formats.html). Thay vào đó, bạn nên sử dụng cung cấp định dạng mong đợi làm đối số thứ hai. Ví dụ: 'moment (" 12-25-1995 "," MM-DD-YYYY ")'. – user113215

23

Sử dụng moment-timezone

moment(date).tz('Europe/Berlin').format(format) 

Trước khi có thể truy cập vào một múi giờ cụ thể, bạn sẽ cần phải tải nó như vậy (hoặc sử dụng phương pháp thay thế mô tả here)

moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30') 
+0

Tôi không nghĩ thời điểm tz có sẵn khi câu hỏi được hỏi, nhưng tôi nghĩ đây có thể là cách để đi. Tôi hiện đang làm việc trên một vấn đề tương tự với tất cả các dấu thời gian được lưu trữ như UTC trong MySQL, nhưng để được xem trong một khu vực cụ thể phụ thuộc vào cấu hình người dùng và không phải là múi giờ của khách hàng. – nickdnk

2

Chỉ cần đến acreoss này, và kể từ khi tôi có cùng một vấn đề, tôi chỉ đăng các kết quả mà tôi đã đưa ra với

khi phân tích cú pháp, bạn có thể cập nhật giá trị bù trừ (tức là tôi đang phân tích dữ liệu (1.1.2014) và tôi chỉ muốn ngày, ngày 1 tháng 1 năm 2014. Trên GMT + 1 tôi sẽ nhận được ngày 31 tháng 12 năm 2013. Vì vậy, tôi bù đắp giá trị đầu tiên.

moment(moment.utc('1.1.2014').format()); 

Vâng, đã có ích cho tôi để hỗ trợ trên các múi giờ

B

9

.zone() đã không được chấp nhận và bạn nên sử dụng utcOffset thay thế:

// for a timezone that is +7 UTC hours 
moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm') 
Các vấn đề liên quan