2015-02-06 8 views
11

Utilizzando moment.js (con fuso orario), voglio ottenere l'abbreviazione del fuso orario (ad esempio PST) per le impostazioni internazionali correnti.Ottieni l'abbreviazione del fuso orario utilizzando il valore di offset

var now = Date.now(); // 1423254073931 
var zone = moment(now).zone(); // 480 
var timezone = 

Come posso ottenere l'abbreviazione fuso orario? Tutti gli esempi che ho visto nei documenti e altrove scelgono una regione specifica come "America/New_York".

Dai documenti, sembra che io possa ottenere le informazioni dallo Zone Object con zone.abbr(timestamp) ma non sono sicuro di come accedere all'oggetto zona.

JSFiddle

+0

e non è possibile usare '/\(([^)]+)\)/.exec(new Date()) [1]'? –

+0

@RobRaisch Non penso che funzionerà su browser. Ad esempio, questo è il risultato di 'new Date' in Firefox:' 2015-02-06T23: 40: 57.085Z' – thetallweeks

+0

In realtà, il risultato di 'new Date()' è una nuova istanza di un oggetto Date che appare FF per stampare sulla console in un formato non standard. Quindi, al posto di quanto sopra, puoi '/\(([^)]+)\)/.exec((new Date()). ToString()) [1]' che qui a Boston, restituisce "Eastern Standard Time " –

risposta

25

Il titolo e la questione sono diversi. Nel titolo, chiedi come ottenerlo usando l'offset, il che non sarebbe possibile. Esistono molti fusi orari che condividono lo stesso offset, pertanto non è possibile distinguere un'abbreviazione del fuso orario da un offset.

Ma nella domanda, è stato chiesto come ottenere l'abbreviazione per la locale corrente, per un timestamp specifico.

Il problema generale è che non esiste un modo completamente affidabile per rilevare il fuso orario corrente. Questo è discusso in this answer. Quindi la zona del fuso orario non può determinare in modo deterministico quale fuso orario deve essere caricato di default.

Ci sono alcune altre opzioni disponibili.

  • In alcuni browser, i ECMAScript Internationalization API estensioni sono supportate sulla funzione toLocaleString dell'oggetto Date. Quando supportato, è possibile farlo (senza momento):

    var d = new Date(); // or whatever date you have 
    var tzName = d.toLocaleString('en', {timeZoneName:'short'}).split(' ').pop(); 
    

    Nel browser supportati, si otterrà un valore di tipo "EST". Si potrebbe voler fare una sorta di test però, perché non funzionerà in tutti i browser.

  • È possibile utilizzare uno script come jsTimeZoneDetect da indovinare nel fuso orario locale. È di solito corretto, ma non è garantito. Potresti quindi passare quel valore alla zona temporale.

    var tzName = jstz.determine().name(); 
    var m = moment(); 
    var abbr = m.tz(tzName).zoneAbbr(); // or .format('z') 
    
  • C'è anche ora supporto integrato per il rilevamento fuso orario/indovinare in moment-timezone:

    var tzName = moment.tz.guess(); 
    var abbr = m.tz(tzName).zoneAbbr(); // or .format('z') 
    
+0

Questo è bello sapere. In precedenza avevo pensato che l'offset fosse unico, quindi poteva essere usato per ottenere il fuso orario. – thetallweeks

+0

L'ultima generazione di fuso orario contiene anche l'ipotesi del fuso orario. – RonyK

5

ultima build di moment.js darebbe indovinare fuso orario: PR#220 per esempio: moment.tz.guess(); will result in 'America/New_York'

Problemi correlati