2012-05-03 31 views
11

Câu trả lời trước đây ở đây chỉ cho tôi moment.js để xử lý ngày javascript và tôi thực sự vui khi tìm thấy nó. Tôi có thể phân tích và thao tác khá vui vẻ.Nhận moment.js để hiển thị dữ liệu phù hợp với thông tin đang được xem

Người sử dụng trên tôi nhìn trang web tại thông tin liên quan đến đa dạng vật lý các trang web/địa điểm, và tôi muốn thể hiện datetimes liên trong thời gian cụ thể đến địa điểm đó, không vị trí người sử dụng.

Mỗi trang web vật lý có một chuỗi thuộc tính múi giờ như "Châu Âu/London" hoặc "Châu Âu/Amsterdam"

datetimes My đều được lưu trữ và chuyển giao từ DB trong UTC.

Có cách thông minh đơn giản nào tôi có thể hiển thị đối tượng moment.js của mình trong bất kỳ múi giờ được chỉ định nào không?

+2

Không, nhưng bạn có thể sử dụng https://github.com/mde/timezone-js để chuyển đổi. Xem thêm vấn đề này (https://github.com/timrwood/moment/issues/162) trên trình theo dõi github moment.js; một số hành vi định dạng tz đã không còn được sử dụng để thay đổi Date.toString() khác nhau; nó cũng trỏ đến múi giờ-js. –

+1

Tôi lo sợ điều này có thể là trường hợp và phần nào bị từ chối. moment.js rất thanh lịch và nhỏ, có vẻ như một sự gian lận gây ô nhiễm nó với các libs khác. :-( – Aitch

Trả lời

10

Về mặt lý thuyết, bạn có thể làm điều gì đó như thế này.

moment.fn.formatInZone = function(format, offset) { 
    return this.clone().utc().add('hours', offset).format(format); 
} 

moment().formatInZone('HH:mm:ss', 7); 
moment().formatInZone('HH:mm:ss', -7); 

Tuy nhiên, điều này đòi hỏi bạn phải biết chính xác bù đắp, do đó, nó sẽ không tính đến thời gian tiết kiệm ánh sáng ban ngày.

+0

Rất nhiều người nói về vấn đề này có được tất cả các verklempt về OMG bạn cần phải tính toán bù đắp, nhưng trong rất nhiều trường hợp bạn đang gửi chuỗi ngày xuống từ máy chủ đã có chính xác bù đắp nhúng trong chúng (có tính đến thời gian tiết kiệm ánh sáng ban ngày.) – Obie

2

Nếu bạn muốn hiển thị ngày trong ANOTHER múi giờ hơn người dùng thực sự, bạn cần bắt đầu tìm kiếm các nội dung như https://bitbucket.org/pellepim/jstimezonedetect (nếu bạn cần phát hiện múi giờ nào người dùng đang ở) và https://github.com/mde/timezone-js nếu bạn cần bản địa hóa ngày giữa các vùng.

jsTimezoneDetect mà tôi liên kết ở trên sẽ giúp bạn cung cấp danh sách rút gọn các múi giờ có liên quan.

Rằng bạn có thời gian lưu trữ được lưu trữ trong UTC sẽ làm cho nó dễ dàng hơn rất nhiều đối với bạn nhờ vào mde/timezone-js.

0

Trong node.js, điều này thực sự khá đơn giản khi sử dụng nút thời gian (https://github.com/TooTallNate/node-time). Ghi đè lên các đối tượng Date toàn cầu, sau đó mở rộng moment.js:

var time = require('time')(Date), 
    moment = require('moment'); 

moment.fn.setTimezone = function(timezone, relative) { 
    this.toDate().setTimezone(timezone, relative); 
    return this; 
} 

moment.fn.getTimezone = function() { 
    return this.toDate().getTimezone(); 
} 

Đối với biện pháp tốt hãy ném vào một chức năng tiện ích để chuyển đổi "đến" chuỗi ngày/giờ để UTC:

moment.fromTimezone = function(datetime, timezone) { 
    return moment(datetime, "YYYY-MM-DD HH:mm").setTimezone(timezone, true).setTimezone("UTC"); 
} 

Và bạn có thể làm điều này:

var fmt = "YYYY-MM-DD HH:mm", 
    datetime = "2013-03-21 00:40", 
    timezone = "Israel", 
    m = moment.fromTimezone(datetime, timezone); 

console.log(datetime, "in", timezone, "is", m.format(fmt), "in UTC"); 
console.log(m.format(fmt), "in UTC is", m.setTimezone(timezone).format(fmt), "in", m.getTimezone()); 

Shell đầu ra:

$ node mtz.js 
2013-03-21 00:40 in Israel is 2013-03-20 22:40 in UTC 
2013-03-20 22:40 in UTC is 2013-03-21 00:40 in Israel 
$ 
Các vấn đề liên quan