Rileva l’abbreviazione del fuso orario utilizzando JavaScript

Ho bisogno di un modo per rilevare il fuso orario di un dato object data. NON voglio l’offset, né voglio il nome completo del fuso orario. Ho bisogno di ottenere l’abbreviazione del fuso orario. Ad esempio, GMT, UTC, PST, MST, CST, EST, ecc …

È ansible? Il più vicino che ho ottenuto è quello di analizzare il risultato di date.toString (), ma anche questo non mi darà un’abbreviazione. Mi dà il nome lungo del fuso orario.

Se tutto il resto fallisce, puoi semplicemente creare il tuo hashtable con i nomi lunghi e le abbreviazioni .

Una soluzione nativa:

var zone = new Date().toLocaleTimeString('en-us',{timeZoneName:'short'}).split(' ')[2] console.log(zone) 

[mi dispiace per come scrivo l’inglese]

Ciao, l’object data non ha un metodo per ottenere l’abbreviazione del fuso orario, ma è implicito lì quasi alla fine del ritorno toString:

per esempio

 var rightNow = new Date(); alert(rightNow); 

l’output sarà qualcosa come “Wed 30 Mar 2011 17:29:16 GMT-0300 (ART)” così, è ansible isolare ciò che è tra parentesi “ART” che è l’abbreviazione del fuso orario

 var rightNow = new Date(); alert(String(String(rightNow).split("(")[1]).split(")")[0]); 

l’uscita sarà “ART”

è tardi per rispondere, ma spero che possa essere utile per qualcuno

moment-timezone include un metodo non documentato .zoneAbbr() che restituisce l’abbreviazione del fuso orario. Ciò richiede anche un insieme di regole che sono disponibili per selezionare e scaricare secondo necessità.

Facendo questo:

     

Ritorna:

 'PDT' // As of this posting. 

Modifica (febbraio 2018)

Evan Czaplicki ha lavorato a una bozza di proposta per aggiungere un’API del fuso orario ai browser .

Aggiornato per il 2015:

jsTimezoneDetect può essere utilizzato insieme al fuso orario per ottenere il lato client dell’abbreviazione nel fuso orario:

 moment.tz(new Date(), jstz.determine().name()).format('z'); //"UTC" 

Moment-timezone non può farlo da solo in quanto la sua funzione che lo gestiva era deprezzata perché non funzionava in tutte le circostanze: https://github.com/moment/moment/issues/162 per ottenere l’abbreviazione del fuso orario lato client .

Funziona perfettamente in Chrome, Firefox ma solo per lo più in IE11. In IE11, i fusi orari senza abbreviazioni dirette come “Indian Chagos Time” restituiranno “ICT” anziché il corretto “IOT”

 var result = "unknown"; try{ // Chrome, Firefox result = /.*\s(.+)/.exec((new Date()).toLocaleDateString(navigator.language, { timeZoneName:'short' }))[1]; }catch(e){ // IE, some loss in accuracy due to guessing at the abbreviation // Note: This regex adds a grouping around the open paren as a // workaround for an IE regex parser bug result = (new Date()).toTimeString().match(new RegExp("[AZ](?!.*[\(])","g")).join(''); } console.log(result); 

Risultato:

 "CDT" 

Per un supporto crossbrowser, ti consiglio di utilizzare la libreria YUI 3:

 Y.DataType.Date.format(new Date(), {format:"%Z"}); 

Supporta gli identificatori strftime .

Per maggiori informazioni: http://yuilibrary.com/yui/docs/datatype/#dates

So che il problema rimane delle differenze tra i browser, ma questo è quello che usavo per ottenere in Chrome. Tuttavia non è ancora un’abbreviazione perché Chrome restituisce il nome lungo.

 new Date().toString().replace(/^.*GMT.*\(/, "").replace(/\)$/, "") 

Questo è un argomento delicato. Da quello che ho capito, il fuso orario non è incorporato come parte dell’object Date quando viene creato. Non è inoltre ansible impostare il fuso orario per un object Date. Tuttavia, esiste un offset del fuso orario che è ansible ottenere da un object Date determinato dalle impostazioni del sistema host dell’utente (fuso orario). Pensa al fuso orario come a un modo per determinare l’offset da UTC.

Per semplificare la vita, consiglio vivamente il moment e il moment-timezone per gestire queste cose. Moment crea un object wrapper per Date con una bella API per tutti i tipi di cose.

Se un object data esistente ti viene fornito attraverso alcuni parametri o qualcosa, puoi passarlo al costruttore quando crei un object momento e sei pronto per il lancio. A questo punto è ansible utilizzare la zona moment-timezone per indovinare il nome del fuso orario dell’utente, quindi utilizzare la formattazione del fuso orario per ottenere l’abbreviazione per il fuso orario. Mi azzarderei a dire che la maggior parte degli utenti ha il proprio fuso orario impostato automaticamente, ma non si dovrebbe fare affidamento su questo per una precisione del 100%. Se necessario, è anche ansible impostare il fuso orario che si desidera utilizzare manualmente prima di estrarre il formato necessario.

In generale, quando si lavora con data e ora, è meglio memorizzare UTC nel proprio database e quindi usare il momento js per formattare il tempo per il fuso orario dell’utente quando lo si visualizza. In alcuni casi è necessario accertarsi che il fuso orario sia corretto. Ad esempio se si consente a un utente di pianificare qualcosa per una data e un’ora specifiche. Dovresti essere assolutamente sicuro che con un utente della costa occidentale tu abbia impostato il fuso orario su PDT / PST prima di convertirlo in UTC per l’archiviazione nel tuo database.

Riguardo l’abbreviazione del fuso orario …
Ecco un esempio di base per ottenere l’abbreviazione del fuso orario usando il momento e il fuso orario.

 // if all you need is the user's timezone abbreviation you don't even need a date object. const usersTimezoneName = moment.tz.guess() const timezoneAbbr = moment().tz(usersTimezoneName).format('z') console.log(timezoneAbbr) // PST (depending on where the user is) // to manually set the timezone const newYorkAbbr = moment(dateObj).tz('America/New_York').format('z') console.log(newYorkAbbr) // EST 

Per visualizzare un object data specifico con offset per un fuso orario specifico puoi farlo.

 const xmas = new Date('December 25, 2017 16:20:00') const losAngelesXmas = moment(xmas).tz('America/Los_Angeles') console.log(losAngelesXmas.format("dddd, MMMM Do YYYY, h:mm:ss a")) // Monday, December 25th 2017, 4:20:00 pm 

Prova la class di chiusura di Google goog.i18n.DateTimeSymbols e le relative classi relative alle impostazioni locali.

Non è ansible con JavaScript vaniglia. I browser non sono coerenti con il ritorno delle stringhe del fuso orario. Alcuni offset di ritorno come +0700 mentre altri restituiscono PST .

Non è coerente o affidabile, motivo per cui è necessario script di terze parti come moment.js (e moment-timezone.js ) o creare il proprio hashtable per la conversione tra offset e abbreviazioni del fuso orario.

Ecco un JavaScript autoadattante, formato di 12 ore di data / ora che non risponde alla domanda, tuttavia può aiutare gli altri in quanto è correlato e si basa sulla soluzione di Stephen DuMont e sul collegamento MDN . Le W3 Schools hanno svolto un tutorial molto utile e gli aggiornamenti in tempo reale non richiedono l’aggiornamento della pagina.

I test con le ultime versioni di desktop FireFox, Chrome, Opera e Internet Explorer 11 funzionano tutti. L’ora “2 cifre” sembra solo prefissare uno zero per i singoli valori in IE, tuttavia i minuti restituiscono un valore a 2 cifre affidabile per tutti i browser. I test con Windows Safari distriggersto funzionano anche se il formato 12 ore viene ignorato e i secondi non sono nascosti.

La funzione include il fuso orario locale, nonché le opzioni regolabili per le lingue di fallback, la visualizzazione di giorno e data e il formato 12/24 ore. La data e l’ora sono state divise per aggiungere la stringa “at” che separa. L’impostazione solo di “toLocaleTimeString” con le opzioni selezionate restituirà anche la data e l’ora. Le pagine MDN possono essere referenziate per opzioni e valori.

  
 

Sono stato in grado di raggiungere questo objective con il solo istante.

 moment.tz(moment.tz.guess()).zoneAbbr() //IST 
 try { result = /.*\s(.+)/.exec(date.toLocaleDateString(navigator.language, {timeZoneName:'short' }))[1]; } catch(e) { result = (new Date()).toTimeString().match(new RegExp("[AZ](?!.*[\(])","g")).join(''); } console.log(result);