Obțineți decalajul utc din fusul orar în Javascript (Programare, Javascript, Fus Orar, Datejs)

user3124032 a intrebat.

Am nevoie de o funcție Javascript care, dat fiind un fus orar, returnează offset-ul utc curent.

De exemplu, theFuncIneed(‘US/Eastern’) -> 240

Aveți vreo idee?

Mulțumesc

Comentarii

  • Creați un obiect cu numele fusurilor orare ca proprietăți și offset-ul ca valoare. Rețineți că nu există un standard pentru numele zonelor orare, acestea se schimbă din când în când și există duplicate (de exemplu, EST). –  > Por RobG.
  • Consultați moment.js, are un zone() metodă. –  > Por Barmar.
  • @RobG – US/Eastern este un valid IANA fus orar identificator. Îl puteți găsi în partea de jos a listei aici. –  > Por Matt Johnson-Pint.
  • @MattJohnson – Nu sunt sigur care este punctul tău de vedere. IANA furnizează decalaje de fus orar pentru anumite locații. Datele IANA nu sunt un standard și nici măcar nu fac autoritate și nu există nicio pretenție în acest sens (în antetul fișierului de date se spune: „Aceste date nu fac în niciun caz autoritate; dacă credeți că știți mai bine, editați fișierul”). –  > Por RobG.
  • @RobG – De acord. Baza de date IANA privind fusul orar nu este un standard în felul în care ISO 8601 este un standard. Dar este un standard de facto prin convenția că este utilizat la scară largă în mai multe sisteme de operare, limbaje de programare și biblioteci. Așadar, deși nu există garanții, este foarte probabil ca US/Eastern va fi recunoscut de toate implementările. –  > Por Matt Johnson-Pint.
4 răspunsuri
Matt Johnson-Pint

În general, , acest lucru nu este posibil.

  • US/Eastern este un identificator pentru un fus orar. (Este de fapt un alias pentru America/New_York, , care este adevăratul identificator).

  • 240 este un fus orar offset. Este mai frecvent scris ca -04:00 (inversați semnul, împărțiți la 60).

  • Fusul orar de est al SUA este compus atât din ora standard de est, care are decalajul de -05:00 și Eastern Daylight Time, care are un decalaj de -04:00.

Așadar, nu este deloc corect să spunem US/Eastern = 240. Vă rugăm să citiți wiki-ul cu tag-ul timezone, în special secțiunea intitulată „Time Zone != Offset”.

Acum, ați cerut codul curent offset, care este posibil. Dacă furnizați o referință de dată și oră, puteți rezolva acest lucru.

  • Pentru fusul orar local al computerului pe care se execută codul javascript, acest lucru este integrat cu ajutorul funcției .getTimeZoneOffset() de la orice instanță a unui fișier Date obiect.

  • Dar dacă doriți să o faceți pentru un specific fus orar specific, atunci va trebui să folosiți una dintre bibliotecile pe care le-am enumerat aici.

Comentarii

  • ECMA-262 definește decalaj de fus orar ca UTC - localTime exprimat în minute. Așadar, cred că este rezonabil ca într-un forum javascript să scrieți +240 unde -04:00 ar putea fi folosit altfel. –  > Por RobG.
  • .getTimeZoneOffset() ar trebui să fie .getTimezoneOffset() fără litera Z majusculă –  > Por Graham Walters.
ranjan_purbey

Următoarea funcție poate fi utilizată pentru a returna decalajul UTC în funcție de un fus orar:

const getTimezoneOffset = (timeZone, date = new Date()) => {
  const tz = date.toLocaleString("en", {timeZone, timeStyle: "long"}).split(" ").slice(-1)[0];
  const dateString = date.toString();
  const offset = Date.parse(`${dateString} UTC`) - Date.parse(`${dateString} ${tz}`);
  
  // return UTC offset in millis
  return offset;
}

Poate fi utilizată astfel:

const offset = getTimezoneOffset("Europe/London");
console.log(offset);
// expected output => 3600000

Comentarii

  • Acest lucru este ușor incorect. Decalajul UTC ar trebui să fie pozitiv pentru fusurile orare care se află în spatele lui și negativ pentru fusurile orare care se află în fața lui. Prin urmare, scăderea trebuie să fie inversată: Date.parse(`${dateString} ${tz}`) - Date.parse(`${dateString} UTC`);. În caz contrar, nu se va alinia cu funcția încorporată Date.prototype.getTimezoneOffset. –  > Por fgblomqvist.
  • De asemenea, rezultatul așteptat pentru "Europe/London" ar trebui să fie 0 –  > Por Avraham.
  • @Avraham decalajul depinde de data din cauza DST. De aceea, funcția ia o dată ca al doilea argument –  > Por ranjan_purbey.
Alexandru R

Puteți face acest lucru folosind moment.js

moment.tz(‘nume fus orar’).utcOffset()

Deși acest lucru implică utilizarea moment-timezone.js

Comentarii

  • trebuie să aveți instalat și pachetul moment-timezone –  > Por Brian McCall.
Weihang Jian

A devenit posibil în zilele noastre cu Intl API:

Implementarea de Intl se bazează pe icu4c. Dacă săpați în codul sursă, veți găsi că numele fusului orar diferă în funcție de fiecare localitate, de exemplu:

Din fericire, există un locale, Interlingua (eticheta langauge este ia), care folosește același model (ex. GMT+11:00) pentru numele fusurilor orare.

Fragmentul de mai jos vă poate satisface nevoile:

Acest mod poate fi puțin mai complicat, dar funcționează bine în proiectul meu de producție. Sper să vă ajute și pe dumneavoastră 🙂

Actualizare

Multe mulțumiri lui Bort pentru că a semnalat greșeala de tipar. Am corectat fragmentul.

Comentarii

  • Există o greșeală de scriere la if (minute) result + parseInt(minute);. Ar trebui să fie +=? –  > Por Bort.
  • De asemenea, acest lucru nu ia în considerare schimbările de ora de vară. –  > Por Bort.
  • Acest lucru nu funcționează pentru valorile din exemplu – returnează 0 pentru „US/Eastern” și „Atlantic/Reykjavik”.  > Por Avraham.