Come posso raccogliere le informazioni sul fuso orario del visitatore? Ho bisogno del fuso orario e delle ore di offset GMT.
Come posso raccogliere le informazioni sul fuso orario del visitatore? Ho bisogno del fuso orario e delle ore di offset GMT.
Risposte:
var offset = new Date().getTimezoneOffset();
console.log(offset);
La differenza di fuso orario è la differenza, in minuti, tra l'ora UTC e l'ora locale. Si noti che ciò significa che l'offset è positivo se il fuso orario locale è dietro UTC e negativo se è avanti. Ad esempio, se il fuso orario è UTC + 10 (Australian Eastern Standard Time), verrà restituito -600. L'ora legale impedisce a questo valore di essere una costante anche per una determinata locale
Si noti che non tutti i fusi orari sono sfalsati di ore intere: ad esempio, Terranova è UTC meno 3h 30m (lasciando l'ora legale fuori dall'equazione).
getTimezoneOffset
in vigore? L'articolo a cui ti riferisci è datato giugno 2007 e non contiene dettagli su come la funzione non è precisa. E in effetti la libreria che jsTimezoneDetect
hai indicato si utilizza da getTimezoneOffset
sola.
var hrs = -(new Date().getTimezoneOffset() / 60)
per compensare le ore normalmente utilizzate
timezone
! =utc offset
L'uso di un offset per calcolare il fuso orario è un approccio sbagliato e incontrerai sempre dei problemi. I fusi orari e le regole sull'ora legale possono cambiare in diverse occasioni durante l'anno, ed è difficile tenere il passo con i cambiamenti.
Per ottenere il fuso orario IANA del sistema in JavaScript, è necessario utilizzare
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
ecma-402 / 1.0 dice che timeZone
potrebbe essere indefinito se non fornito al costruttore. Tuttavia, la bozza futura (3.0) ha risolto il problema modificando il fuso orario predefinito del sistema.
In questa versione dell'API di internazionalizzazione ECMAScript, la
timeZone
proprietà rimarrà indefinita se non ètimeZone
stata fornita alcuna proprietà nell'oggetto opzioni fornito alIntl.DateTimeFormat
costruttore . Tuttavia, le applicazioni non dovrebbero fare affidamento su questo, poiché le versioni future potrebbero restituire un valore String che identifica invece il fuso orario corrente dell'ambiente host.
in ecma-402 / 3.0 che è ancora in una bozza in cui è cambiato
In questa versione dell'API di internazionalizzazione di ECMAScript 2015, la
timeZone
proprietà sarà il nome del fuso orario predefinito se non ètimeZone
stata fornita alcuna proprietà nell'oggetto opzioni fornito alIntl.DateTimeFormat
costruttore. La versione precedente ha lasciato latimeZone
proprietà non definita in questo caso.
Mi rendo conto che questa risposta è un po 'fuori tema, ma immagino che molti di noi in cerca di una risposta volessero anche formattare il fuso orario per la visualizzazione e forse ottenere anche l'abbreviazione di zona. Quindi eccolo qui ...
Se desideri che il fuso orario del client sia formattato correttamente, puoi fare affidamento sul metodo JavaScript Date.toString ed eseguire:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
Questo ti darà "GMT-0400 (EST)" per esempio, inclusi i minuti del fuso orario quando applicabile.
In alternativa, con regex è possibile estrarre qualsiasi parte desiderata:
Per "GMT-0400 (EDT)":
new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]
Per "GMT-0400":
new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]
Solo per "EDT":
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
Per solo "-0400":
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Riferimento Date.toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
split[4] + " " + split[5]
?!
split
contiene: ["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
quindi il risultato èDaylight Time)
new Date().toString()
dipende completamente dalle impostazioni locali. Aspettarsi che gli output degli altri clienti assomiglino ai tuoi è una pessima idea.
È già stato risposto come ottenere l'offset in minuti come numero intero, ma nel caso in cui qualcuno desideri l'offset GMT locale come stringa, ad esempio "+1130"
:
function pad(number, length){
var str = "" + number
while (str.length < length) {
str = '0'+str
}
return str
}
var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
pad(parseInt(Math.abs(offset/60)), 2)+
pad(Math.abs(offset%60), 2))
pad(parseInt(Math.abs(offset/60)), 2)
per farlo bene ... altrimenti potresti finire per ottenere +5.530 come nel mio caso ... non sono sicuro che il pavimento di matematica ecc sarà una cosa migliore qui o no .... ma questo atleast mi dà +0530 come previsto
Puoi usare:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
Il rilevamento del fuso orario del browser è piuttosto complicato da ottenere, poiché ci sono poche informazioni fornite dal browser.
Momento Timezone utilizza Date.getTimezoneOffset()
e Date.toString()
una manciata di momenti attorno all'anno in corso per raccogliere quante più informazioni possibili sull'ambiente del browser. Quindi confronta tali informazioni con tutti i dati di fuso orario caricati e restituisce la corrispondenza più vicina. In caso di vincoli, viene restituito il fuso orario con la città con la più grande popolazione.
console.log(moment.tz.guess()); // America/Chicago
Ho scritto una funzione nel mio progetto, che restituisce il fuso orario in hh:mm
formato. Spero che questo possa aiutare qualcuno:
function getTimeZone() {
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}
// Outputs: +5:00
Un one-liner che fornisce sia l'offset sia il fuso orario è semplicemente chiamare toTimeString () su un nuovo oggetto Date. Da MDN:
Il
toTimeString()
metodo restituisce la parte temporale di un oggetto Date in forma leggibile in inglese americano.
Il problema è che il fuso orario non è nel formato IANA standard; è un po 'più intuitivo rispetto al formato IANA "continente / città" . Provalo:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
In California in questo momento, toTimeString()
ritorna Pacific Daylight Time
mentre l'API Intl ritorna America/Los_Angeles
. In Colombia, otterresti Colombia Standard Time
, controAmerica/Bogota
.
Si noti che molte altre risposte a questa domanda tentano di ottenere le stesse informazioni chiamando Date.toString (). Tale approccio non è così affidabile, come spiega MDN :
Le istanze di data si riferiscono a un momento specifico. Chiamare toString () restituirà la data formattata in una forma leggibile dall'inglese americano. [...] A volte è desiderabile ottenere una stringa della porzione di tempo; una cosa del genere può essere realizzata con il
toTimeString()
metodo.Il
toTimeString()
metodo è particolarmente utile perché i motori conformi che implementano ECMA-262 possono differire nella stringa ottenutatoString()
per gliDate
oggetti, poiché il formato dipende dall'implementazione; semplici approcci di affettatura delle stringhe potrebbero non produrre risultati coerenti su più motori.
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
Con moment.js :
moment().format('zz');
Z
eZZ
Con momentjs, puoi trovare il fuso orario corrente come
console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
Con dayjs, puoi trovare il fuso orario corrente come
console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>
Entrambe le API restituiscono l'offset utc in pochi minuti.
getTimezoneOffset()
.
Fuso orario in ore
var offset = new Date().getTimezoneOffset();
if(offset<0)
console.log( "Your timezone is- GMT+" + (offset/-60));
else
console.log( "Your timezone is- GMT-" + offset/60);
Se vuoi essere preciso come hai detto nel commento, allora dovresti provare in questo modo-
var offset = new Date().getTimezoneOffset();
if(offset<0)
{
var extraZero = "";
if(-offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
var extraZero = "";
if(offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}
Se tutto ciò che serve è l'abbreviazione del fuso orario "MST" o "EST":
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
Date.toString()
non è affidabile e MDN spiega perché. Nella mia risposta ho incollato la sezione pertinente dai loro documenti .
Vedere questo operatore risultante era opposto al fuso orario. Quindi applicare alcune funzioni matematiche quindi convalidare il numero minore o più.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
round
? Dovrebbe essere floor
, no?
function getLocalTimeZone() {
var dd = new Date();
var ddStr = dd.toString();
var ddArr = ddStr.split(' ');
var tmznSTr = ddArr[5];
tmznSTr = tmznSTr.substring(3, tmznSTr.length);
return tmznSTr;
}
Esempio: gio 21 giu 2018 18:12:50 GMT + 0530 (India Standard Time)
O / P: +0530
Date.toString()
non è affidabile e MDN spiega perché. Nella mia risposta ho incollato la sezione pertinente dai loro documenti .
Prova questo,
new Date().toString().split("GMT")[1].split(" (")[0]
Questo valore proviene dalla macchina dell'utente e può essere modificato in qualsiasi momento, quindi penso che non abbia importanza, voglio solo ottenere un valore approssimativo e convertirlo in GMT nel mio server.
Ad esempio, vengo da Taiwan e per me restituisce "+8".
JS
function timezone() {
var offset = new Date().getTimezoneOffset();
var minutes = Math.abs(offset);
var hours = Math.floor(minutes / 60);
var prefix = offset < 0 ? "+" : "-";
return prefix+hours;
}
$('#result').html(timezone());
HTML
<div id="result"></div>
Risultato
+8
Sul new Date(
) è possibile ottenere l'offset, per ottenere il nome del fuso orario che si può fare:
new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
ottieni il valore tra ()
alla fine della data, ovvero il nome del fuso orario.
Date.toString()
non è affidabile e MDN spiega perché. Nella mia risposta ho incollato la sezione pertinente dai loro documenti . Inoltre, questa risposta è stata già fornita almeno 3 volte.
Questa sarebbe la mia soluzione:
// For time zone:
const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
// Offset hours:
const offsetHours = new Date().getTimezoneOffset() / 60;
console.log(`${timeZone}, ${offsetHours}hrs`);
In alternativa a new Date().getTimezoneOffset()
e moment().format('zz')
, puoi anche usaremomentjs:
var offset = moment.parseZone(Date.now()).utcOffset() / 60
console.log(offset);
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
jstimezone è anche piuttosto difettoso e non mantenuto ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )
Usa questo per convertire OffSet in postivo:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
Stavo cercando solo la stringa di 3 lettere (come "PDT") e ho provato la risposta di Marquez, ma ho dovuto modificarla un po 'per il supporto cross-browser. Fortunatamente, la stringa è l'ultima potenziale corrispondenza :)
Ecco cosa ho fatto, in CoffeeScript:
browserTimezone = ->
userDate = new Date()
zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
userZone = zoneMatches[zoneMatches.length - 1]
Funziona in IE8, IE9, Safari 9, Firefox 44 e Chrome 48
Date.toString()
non è affidabile e MDN spiega perché. Nella mia risposta ho incollato la sezione pertinente dai loro documenti .
Devi solo includere moment.js e jstz.js
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.6/jstz.min.js"></script>
dopodiché
<script>
$(function(){
var currentTimezone = jstz.determine();
var timezone = currentTimezone.name();
alert(timezone);
});
</script>
Questo è un ottimo lavoro per me:
// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;
puoi semplicemente provare questo. ti restituirà il tempo corrente della macchina
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())
new Date(new Date().getTime());
visualizzerebbe: "Ven 28 dic 2018 10:15:23 GMT + 0100 (Central European Standard Time) {}"