Obteniendo moment.js para mostrar las dates apropiadas a la información que se está viendo

Las respuestas anteriores aquí me señalaron a moment.js para el event handling la date de javascript y estoy muy contento de encontrarlo. Puedo analizar y manipular muy felizmente.

Los usuarios de mi website miran información relacionada con diversos sitios / ubicaciones físicas, y quiero mostrar los horarios asociados en la hora específica de esa location , no la location de los usuarios.

Cada sitio físico tiene una cadena de atributo de zona horaria como "Europa / Londres" o "Europa / Amsterdam"

Mis dates se almacenan y entregan desde la database en UTC.

¿Existe alguna manera ingeniosamente simple de representar mi object moment.js en cualquier zona horaria específica?

Teóricamente, podrías hacer algo como esto.

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); 

Sin embargo, esto requiere que conozca el desplazamiento correcto, por lo que no tendrá en count el horario de verano.

Si desea mostrar las dates en OTRO huso horario de lo que realmente está el usuario, entonces debe comenzar a search cosas como https://bitbucket.org/pellepim/jstimezonedetect (si necesita detectar en qué zona horaria está un usuario) y https://github.com/mde/timezone-js si necesita localizar dates entre zonas.

jsTimezoneDetect, al que he vinculado anteriormente, te ayudará a proporcionar una list restringida de zonas horarias relevantes.

Que tenga su date y hora almacenada en UTC lo hará bastante fácil para usted gracias a mde / timezone-js.

En node.js esto es bastante simple usando el time del nodo ( https://github.com/TooTallNate/node-time ). Reemplazar el object Date global, luego extender 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(); } 

Para una buena medida, agreguemos una function de utilidad para convertir cadenas de date / hora "entrantes" a UTC:

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

Y puedes hacer esto:

 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()); 

Salida de Shell:

 $ 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 $