2012-05-03 12 views
11

Las respuestas anteriores aquí me indicaron moment.js para el manejo de la fecha de javascript y estoy muy contento de encontrarlo. Puedo analizar y manipular muy felizmente.Obteniendo moment.js para mostrar las fechas apropiadas a la información que se está viendo

Los usuarios de mi sitio web vistazo a información relativa a diversos sitios/lugares físicos, y quiero mostrar datetimes asociados en el tiempo específico para ese lugar, no la ubicación del usuario.

Cada sitio físico tiene una serie de atributos como la zona horaria "Europa/Londres" o "Europa/Ámsterdam"

Mis datetimes se almacenan y se entregan a partir de la base de datos en UTC.

¿Existe alguna manera inteligente y sencilla de representar mi objeto moment.js en cualquier zona horaria especificada?

+2

No, pero puede usar https://github.com/mde/timezone-js para convertir. Consulte también este problema (https://github.com/timrwood/moment/issues/162) en el rastreador de momentos github; algunos comportamientos de formato tz han quedado en desuso para variar las implementaciones de Date.toString(); también apunta a timezone-js. –

+1

Temía que este podría ser el caso y estaba algo en negación. moment.js es tan elegante y pequeño, parece una parodia contaminarlo con otras libs. :-( – Aitch

Respuesta

10

Teóricamente, podría 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 se conoce el correcto desplazamiento, por lo que no tendrá en cuenta el horario de verano.

+0

Mucha gente hablando de este tema se pone al corriente sobre OMG que necesita para calcular el desplazamiento, pero en muchos casos está enviando cadenas de fechas desde el servidor que ya tiene el desplazamiento correcto incrustado en ellas (teniendo en cuenta el horario de verano). – Obie

2

Si desea mostrar las fechas en OTRA zona horaria que el usuario está realmente dentro, entonces debe comenzar a buscar 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 fechas entre zonas.

jsTimezoneDetect que he vinculado anteriormente le ayudará a proporcionar una lista de husos horarios relevantes.

El hecho de que tenga su fecha y hora almacenada en UTC lo hará bastante fácil para usted gracias a mde/timezone-js.

0

En node.js esto es bastante simple usando el tiempo del nodo (https://github.com/TooTallNate/node-time). Anular el objeto Date mundial, a continuación, 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(); 
} 

Por si acaso vamos a lanzar en una función de utilidad para convertir cadenas de fecha/hora "de entrada" a UTC:

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

y se puede 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()); 

Shell de salida:

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