2012-05-03 8 views
11

Le risposte precedenti su qui mi hanno indirizzato a moment.js per la gestione delle date di JavaScript e sono davvero felice di trovarlo. Posso analizzare e manipolare abbastanza felicemente.Ottenere moment.js per mostrare i dati appropriati per le informazioni visualizzate

Gli utenti sono sul mio sito sguardo a informazioni relative ai diversi fisici siti/località, e voglio mostrare datetimes associati nel momento specifico in quella posizione, non la posizione degli utenti.

Ogni sito fisica ha una stringa di attributo fuso orario come "Europa/Londra" o "Europe/Amsterdam"

miei datetimes sono tutti memorizzati e consegnati dal DB in UTC.

Esiste un modo semplice intelligente per rendere il mio oggetto moment.js in un fuso orario specificato?

+2

No, ma è possibile utilizzare https://github.com/mde/timezone-js per convertire. Vedi anche questo numero (https://github.com/timrwood/moment/issues/162) sul tracker github moment.js; alcuni comportamenti in formato tz sono stati deprecati a diverse implementazioni Date.toString(); punta anche a timezone-js. –

+1

Temevo che questo potesse essere il caso ed era un po 'negato. moment.js è così elegante e piccolo, sembra un travestimento inquinarlo con altre librerie. :-( – Aitch

risposta

10

In teoria, si potrebbe fare qualcosa di simile.

Tuttavia, è necessario conoscere l'offset corretto, in modo che non tenga conto dell'ora legale.

+0

Un sacco di persone che parlano di questo problema ottengono tutti verklempt su OMG che è necessario calcolare l'offset, ma in molti casi si inviano stringhe di date verso il basso dal server che ha già l'offset corretto incorporato in esse (tenendo conto dell'ora legale). – Obie

2

Se si desidera visualizzare le date in UN ALTRO fuso orario rispetto a quello in cui si trova effettivamente l'utente, è necessario iniziare a cercare cose come https://bitbucket.org/pellepim/jstimezonedetect (se è necessario rilevare in quale fuso orario è presente un utente) e https://github.com/mde/timezone-js se è necessario localizzarlo date tra le zone.

jsTimezoneDetect che ho collegato sopra vi aiuterà a fornire una lista di fusi orari rilevanti.

Che hai i tuoi tempi di archiviazione memorizzati in UTC lo renderà abbastanza dannatamente facile per te grazie a mde/timezone-js.

0

In node.js questo è in realtà piuttosto semplice utilizzando il nodo-tempo (https://github.com/TooTallNate/node-time). Sovrascrivere l'oggetto Date globale, quindi estendere 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(); 
} 

Per buona misura cerchiamo di gettare in una funzione di utilità per convertire le stringhe di data/ora "in entrata" per UTC:

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

e si può fare questo:

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 uscita:

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