De tijdzone (en offset) van de klant in JavaScript ophalen

Hoe kan ik de tijdzone-informatie van de bezoeker verzamelen?

Ik heb beide nodig:

  1. de tijdzone (bijvoorbeeld Europa/Londen)
  2. en de offset van UTC of GMT (bijvoorbeeld UTC+01)

Antwoord 1, autoriteit 100%

Gebruik getTimezoneOffset()

U kunt de tijdzone offsetin minuten als volgt krijgen:

var offset = new Date().getTimezoneOffset();
console.log(offset);
// if offset equals -60 then the time zone offset is UTC+01

Antwoord 2, autoriteit 98%

Het gebruik van een offset om de tijdzone te berekenen is een verkeerde benadering en je zult altijd problemen tegenkomen. Tijdzones en zomertijdregels kunnen meerdere keren per jaar veranderen, en het is moeilijk om veranderingen bij te houden.

Als u de IANA-tijdzonevan het systeem in JavaScript wilt gebruiken, moet u

gebruiken

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)

Antwoord 3, autoriteit 21%

Ik realiseer me dat dit antwoord een beetje off-topic is, maar ik kan me voorstellen dat velen van ons die op zoek waren naar een antwoord, ook de tijdzone wilden formatteren voor weergave en misschien ook de zone-afkorting wilden krijgen. Dus hier gaat het…

Als u wilt dat de tijdzone van de client netjes wordt opgemaakt, kunt u vertrouwen op de JavaScript Date.toString-methode en het volgende doen:

var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];

Dit geeft u bijvoorbeeld ‘GMT-0400 (EST)’, inclusief de tijdzoneminuten indien van toepassing.

Als alternatief kunt u met regex elk gewenst deel extraheren:

Voor “GMT-0400 (EDT)”:

new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]

Voor “GMT-0400”:

new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]

Voor alleen “EDT”:

new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]

Voor slechts “-0400”:

new Date().toString().match(/([-\+][0-9]+)\s/)[1]

Date.toString-referentie: https://developer.mozilla.org /en/JavaScript/Reference/Global_Objects/Date/toString

BEWERK 10/6/2020 – De bovenstaande oplossing werkt mogelijk niet in alle browsers en locales. Mijn huidige aanbeveling is om een bibliotheek te gebruiken. Enkele goede populaire bibliotheken zijn: moment, date-fns 2, luxon of dayjs.


Antwoord 4, autoriteit 11%

Er is al een antwoord gegeven op het verkrijgen van een offset in minuten als een geheel getal, maar voor het geval iemand de lokale GMT-offset als een string wil, b.v. "+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))

Antwoord 5, autoriteit 11%

U kunt gebruiken:

moment-tijdzone

<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();

Detectie van de tijdzone van de browser is nogal lastig om juist te krijgen, omdat de browser weinig informatie verstrekt.

Moment Timezone gebruikt Date.getTimezoneOffset()en Date.toString()op een handvol momenten rond het huidige jaar om zoveel mogelijk informatie over de browseromgeving te verzamelen als mogelijk. Vervolgens vergelijkt het die informatie met alle geladen tijdzonegegevens en geeft het de beste overeenkomst. In het geval van banden wordt de tijdzone met de stad met de grootste bevolking teruggegeven.

console.log(moment.tz.guess()); // America/Chicago

Antwoord 6, autoriteit 8%

Ik heb een functie in mijn project geschreven, die de tijdzone retourneert in de indeling hh:mm. Ik hoop dat dit iemand kan helpen:

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

Antwoord 7, autoriteit 4%

Een one-liner die zowel de offset als de tijdzone geeft, is door simpelweg toTimeString()op een nieuw Date-object. Van MDN:

De methode toTimeString()retourneert het tijdgedeelte van een Date-object in door mensen leesbare vorm in Amerikaans Engels.

Het addertje onder het gras is dat de tijdzone niet in het standaard IANA-formaat staat; het is wat gebruiksvriendelijker dan het “continent/city” IANAformaat. Probeer het uit:

console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);

Antwoord 8, autoriteit 2%

probeer getTimezoneOffset()van het Dateobject:

var curdate = new Date()
var offset = curdate.getTimezoneOffset()

Deze methode retourneert de tijdzone-offset in minuten, wat het verschil is tussen GMT en lokale tijd in minuten.


Antwoord 9

JavaScript:

var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);

Antwoord 10

Probeer dit:

new Date().toLocaleString("en-US",Intl.DateTimeFormat().resolvedOptions().timeZone)

Dit zoekt naar timeZone in de browser van uw klant.


Antwoord 11

Met moment.js:

moment().format('zz');

Antwoord 12

Met kun je de huidige tijdzone vinden als

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>

Antwoord 13

Tijdzone in uren-

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);

Antwoord 14

Deze waarde is afkomstig van de computer van de gebruiker en kan op elk moment worden gewijzigd, dus ik denk dat het niet uitmaakt, ik wil gewoon een geschatte waarde krijgen en deze vervolgens op mijn server naar GMT converteren.

Ik kom bijvoorbeeld uit Taiwan en het retourneert “+8” voor mij.

Werkvoorbeeld

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>

Resultaat

+8

Antwoord 15

Zie dat deze resulterende operator het tegenovergestelde was van de tijdzone. Dus pas een wiskundige functie toe en valideer het getal minder of meer.

voer hier de afbeeldingsbeschrijving in

Zie het MDN-document

var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)

Antwoord 16

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;
}

Voorbeeld: do 21 juni 2018 18:12:50 GMT+0530 (Indiase standaardtijd)

Op/P: +0530


Antwoord 17

Probeer dit,

new Date().toString().split("GMT")[1].split(" (")[0]

Antwoord 18

Dit zou mijn oplossing zijn:


    // For time zone:
    const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
    // Offset hours:
    const offsetHours = new Date().getTimezoneOffset() / 60;
    console.log(`${timeZone}, ${offsetHours}hrs`);
 Run code snippetHide resultsExpand snippet

Antwoord 19

Als u alleen de afkorting “MST” of “EST” voor de tijdzone nodig heeft:

function getTimeZone(){
    var now = new Date().toString();
    var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
    return timeZone;
}
console.log(getTimeZone());

Antwoord 20

Op de new Date() kun je de offset krijgen, om de naam van de tijdzone te krijgen:

new Date().toString().replace(/(.*\((.*)\).*)/, '$2');

je krijgt de waarde tussen ()aan het einde van de datum, dat is de naam van de tijdzone.


Antwoord 21

Als alternatief voor new Date().getTimezoneOffset()en moment().format('zz')kun je ook :

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>

Antwoord 22

Gebruik dit om OffSet naar positief te converteren:

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);

Antwoord 23

Eens had ik deze “eenvoudige” taak en gebruikte ik (new Date()).getTimezoneOffset()– de aanpak die hier algemeen wordt voorgesteld. Maar het bleek dat de oplossing niet helemaal de juiste was.
Om een aantal ongedocumenteerde redenen gaf new Date()in mijn geval GMT+0200terug terwijl new Date(0)GMT+ retourneerde 0300wat gelijk had. Sindsdien gebruik ik altijd

(new Date(0)).getTimezoneOffset()om een correcte timeshift te krijgen.


Antwoord 24

Waarom gebruik je niet gewoon:

function timezoneOffset(date: Date) {
  return 6000 * ((date.getUTCHours() - date.getHours()) * 60 + ((date.getUTCMinutes() - date.getMinutes())))
}

Antwoord 25

Als je alleen de tijdzone wilt (zoals IST, GMT, etc.), gebruik dan dit:

var timezone = new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1];
var parts = timezone.split(' ');
var tz = "";
parts.forEach(function (element) { tz += element.substring(0, 1); });

Antwoord 26

Je moet gewoon moment.js en jstz.js opnemen

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

en daarna

<script>
$(function(){
 var currentTimezone = jstz.determine();
 var timezone = currentTimezone.name();
 alert(timezone);
});
</script>

Antwoord 27

Dit is heel goed werk voor mij:

// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;

Antwoord 28

je kunt dit gewoon proberen.
het geeft je de huidige machinetijd terug

var _d = new Date(),
t = 0,
d = new Date(t*1000 + _d.getTime())


Antwoord 29

Dit zal het werk doen.


var time = new Date(),
timestamp = Date(1000 + time.getTime());
console.log(timestamp);

Thu May 25 2017 21:35:14 GMT+0300 (IDT)

niet gedefinieerd

Other episodes