So come ottenere la differenza di fuso orario, ma ciò di cui ho bisogno è la capacità di rilevare qualcosa come "America / New York". È anche possibile da JavaScript o è qualcosa che dovrò guestimate in base all'offset?
So come ottenere la differenza di fuso orario, ma ciò di cui ho bisogno è la capacità di rilevare qualcosa come "America / New York". È anche possibile da JavaScript o è qualcosa che dovrò guestimate in base all'offset?
Risposte:
L' API di internazionalizzazione supporta l'acquisizione del fuso orario dell'utente ed è supportata in tutti i browser correnti.
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
Tieni presente che su alcune versioni precedenti del browser che supportano l'API di internazionalizzazione, la timeZone
proprietà è impostata su undefined
anziché sulla stringa del fuso orario dell'utente. Per quanto posso dire, al momento della scrittura (luglio 2017) tutti i browser attuali tranne IE11 restituiranno il fuso orario dell'utente come una stringa.
La risposta più votata è probabilmente il modo migliore per ottenere il fuso orario, tuttavia, Intl.DateTimeFormat().resolvedOptions().timeZone
restituisce il nome del fuso orario IANA per definizione, che è in inglese.
Se vuoi il nome del fuso orario nella lingua dell'utente corrente, puoi analizzarlo dalla Date
rappresentazione della stringa di in questo modo:
function getTimezoneName() {
const today = new Date();
const short = today.toLocaleDateString(undefined);
const full = today.toLocaleDateString(undefined, { timeZoneName: 'long' });
// Trying to remove date from the string in a locale-agnostic way
const shortIndex = full.indexOf(short);
if (shortIndex >= 0) {
const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);
// by this time `trimmed` should be the timezone's name with some punctuation -
// trim it from both sides
return trimmed.replace(/^[\s,.\-:;]+|[\s,.\-:;]+$/g, '');
} else {
// in some magic case when short representation of date is not present in the long one, just return the long one as a fallback, since it should contain the timezone's name
return full;
}
}
console.log(getTimezoneName());
Testato in Chrome e Firefox.
Naturalmente, questo non funzionerà come previsto in alcuni ambienti. Ad esempio, node.js restituisce un offset GMT (esGMT+07:00
) invece di un nome. Ma penso che sia ancora leggibile come riserva.
PS non funzionerà in IE11, proprio come la Intl...
soluzione.
Puoi usare questo script. http://pellepim.bitbucket.org/jstz/
Repository fork o clone qui. https://bitbucket.org/pellepim/jstimezonedetect
Una volta incluso lo script, puoi ottenere l'elenco dei fusi orari in - jstz.olson.timezones
variable.
E il codice seguente viene utilizzato per determinare il fuso orario del browser client.
var tz = jstz.determine();
tz.name();
Goditi jstz!
Recupera il fuso orario per nome (ad esempio "America / New York")
moment.tz.guess();
Intl.DateTimeFormat().resolvedOptions().timeZone
Intl.DateTimeFormat().resolvedOptions().timeZone
restituisce undefined
, ma moment.tz.guess()
restituisce il valore corretto
Puoi semplicemente scrivere il tuo codice utilizzando la tabella di mappatura qui: http://www.timeanddate.com/time/zones/
oppure usa la libreria moment-timezone: http://momentjs.com/timezone/docs/
Vedere zone.name; // America/Los_Angeles
oppure questa libreria: https://github.com/Canop/tzdetect.js
Questo ottiene il codice del fuso orario (ad esempio GMT
) nel vecchio javascript (sto usando lo script dell'app Google con il vecchio motore):
function getTimezoneName() {
return new Date().toString().get(/\((.+)\)/);
}
Lo metto qui solo nel caso qualcuno ne abbia bisogno.
UTC
/ GMT
. Sembra che gli altri siano enunciati; es Pacific Daylight Time
.
Prova questo codice di riferimento da qui
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
$(document).ready(function(){
var tz = jstz.determine(); // Determines the time zone of the browser client
var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.
alert(timezone);
});
</script>
In javascript, il metodo Date.getTimezoneOffset () restituisce l'offset del fuso orario rispetto a UTC, in minuti, per la locale corrente.
var x = new Date();
var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;
Moment'timezone sarà uno strumento utile. http://momentjs.com/timezone/
Converti date tra fusi orari
var newYork = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london = newYork.clone().tz("Europe/London");
newYork.format(); // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format(); // 2014-06-01T17:00:00+01:00