Uzyskanie strefy czasowej klienta (i przesunięcia) w JavaScript

Jak mogę zebrać informacje o strefie czasowej odwiedzającego?

Potrzebuję obu:

    Strefa czasowa (na przykład Europa/Londyn) Na przykład, UTC+01)
Author: Flimm, 2009-07-07

28 answers

Użycie getTimezoneOffset()

Możesz uzyskać przesunięcie strefy czasowej w ciągu kilku minut:

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

Przesunięcie strefy czasowej to różnica, w minutach, między czasem UTC a czasem lokalnym. Oznacza to, że przesunięcie jest dodatnie, jeśli lokalna Strefa czasowa znajduje się za UTC, a ujemne, jeśli jest przed nami. Na przykład, jeśli Twoja strefa czasowa to UTC+10 (Australian Eastern Standard Time), zostanie zwrócona wartość -600. Czas letni zapobiega temu, że wartość ta jest stała nawet dla danego locale

Zauważ, że nie wszystkie strefy czasowe są przesunięte o całe godziny: na przykład Nowa Fundlandia to UTC minus 3H 30m (pomijając czas letni z równania).

Należy również pamiętać, że daje to tylko przesunięcie strefy czasowej (NP: UTC + 01), nie daje strefy czasowej (np: Europa/Londyn).

 644
Author: NickFitz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-22 16:27:18

Używanie offsetu do obliczania strefy czasowej jest złym podejściem i zawsze napotkasz problemy. Strefy czasowe i przepisy dotyczące czasu letniego mogą się zmieniać kilkakrotnie w ciągu roku i trudno nadążyć za zmianami.

Aby uzyskać strefę czasową systemu IANA w JavaScript, należy użyć

console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
[17]}od września 2019 r.działa ona w 95% przeglądarek używanych na całym świecie .

Stara kompatybilność informacje

Ecma-402/1.0 mówi, że timeZone może być niezdefiniowany, jeśli nie zostanie dostarczony konstruktorowi. Jednak przyszły szkic (3.0) naprawił ten problem, zmieniając domyślną strefę czasową systemu.

W tej wersji ECMAScript Internacjonalization API, timeZone nieruchomość pozostanie niezdefiniowana, jeśli żadna timeZone nieruchomość nie była podane w obiekcie options dostarczonym do Intl.DateTimeFormat konstruktor . Jednak aplikacje nie powinny na tym polegać, ponieważ w przyszłości wersje mogą zwracać Wartość łańcuchowa określająca środowisko hosta zamiast tego aktualna Strefa czasowa.

W ecma-402/3.0, który jest nadal w projekcie zmienił się na

W tej wersji internacjonalizacji ECMAScript 2015 API, timeZone właściwość będzie nazwą domyślnej strefy czasowej, jeśli nie timeZone właściwość została dostarczona w obiekcie options dostarczonym do Intl.DateTimeFormat konstruktor. Poprzednia wersja opuściła timeZone właściwość niezdefiniowana w tym przypadku.

 644
Author: Pawel Dubiel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-02 15:04:12

Zdaję sobie sprawę, że ta odpowiedź jest nieco poza tematem, ale wyobrażam sobie, że wielu z nas szukających odpowiedzi również chciał sformatować strefę czasową do wyświetlania i być może uzyskać Skrót strefy też. Więc zaczyna się...

Jeśli chcesz, aby Strefa czasowa klienta była dobrze sformatowana, możesz polegać na dacie JavaScript.metoda toString i do:

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

Daje to na przykład " GMT-0400 (EST)", w tym minuty strefy czasowej, gdy ma to zastosowanie.

Alternatywnie za pomocą regex można wyodrębnić dowolne pożądana część:

Dla "GMT-0400 (EDT)":

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

Dla "GMT-0400":

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

Dla tylko "EDT":

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

Dla tylko "-0400":

new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Data.ToString reference: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString

Edycja 10/6/2020-powyższe rozwiązanie może nie działać we wszystkich przeglądarkach i lokalizacjach. Moim obecnym zaleceniem jest korzystanie z biblioteki. Niektóre dobre popularne biblioteki to: moment, date-fns 2, luxon lub dayjs.

 133
Author: Marquez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-06 13:19:16

To już odpowiedź, jak uzyskać offset w minutach jako liczbę całkowitą, ale w przypadku, gdy ktoś chce lokalnego offsetu GMT jako ciąg znaków, np. "+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))
 73
Author: cryo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-01 05:05:50

Możesz użyć:

Moment-Strefa czasowa

<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>

// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();

Wykrywanie strefy czasowej przeglądarki jest dość trudne do uzyskania, ponieważ przeglądarka dostarcza niewiele informacji.

Moment Timezone używa Date.getTimezoneOffset() i Date.toString() na kilka chwil w całym bieżącym roku, aby zebrać jak najwięcej informacji o środowisku przeglądarki. Następnie porównuje te informacje ze wszystkimi załadowanymi danymi strefy czasowej i zwraca najbliższe dopasowanie. W przypadku powiązań, Strefa czasowa z miastem z największa populacja jest zwracana.

console.log(moment.tz.guess()); // America/Chicago
 72
Author: Sameer Ek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-29 20:02:11

Napisałem w moim projekcie funkcję, która zwraca strefę czasową w formacie hh:mm. Mam nadzieję, że to może komuś pomóc:

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

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


// See output
document.write(getTimeZone());

Working Fiddle

 50
Author: Mr_Green,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-07 07:44:49

Jednowierszowa, która daje zarówno przesunięcie, jak i strefę czasową, polega na wywołaniu tostimestring() na nowym obiekcie Date. Z MDN:

Metoda toTimeString() Zwraca część czasu obiektu Date w formie czytelnej dla człowieka w amerykańskim języku angielskim.

Haczyk polega na tym, że strefa czasowa nie jest w standardowym formacie IANA; jest nieco bardziej przyjazna dla użytkownika niż format "kontynent/miasto" IANA. Wypróbuj:

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

W W tej chwili toTimeString() zwraca Pacific Daylight Time, podczas gdy Intl API zwraca America/Los_Angeles. W Kolumbii dostałbyś Colombia Standard Time, vs. America/Bogota.

Zauważ, że wiele innych odpowiedzi na to pytanie próbuje uzyskać te same informacje przez wywołanie daty.toString(). To podejście nie jest tak wiarygodne, jak wyjaśnia MDN: ]}

Instancje daty odnoszą się do określonego punktu w czasie. Wywołanie ToString () zwróci datę sformatowaną w formie czytelnej dla człowieka w amerykańskim języku angielskim. [...] Czasami jest pożądane, aby uzyskać ciąg porcji czasu; takie coś można osiągnąć za pomocą metody toTimeString().

Metoda toTimeString() jest szczególnie przydatna, ponieważ zgodne silniki implementujące ECMA-262 mogą różnić się ciągiem znaków uzyskanym z toString() dla obiektów Date, ponieważ format jest zależny od implementacji; proste metody cięcia ciągów mogą nie dawać spójnych wyników w wielu silnikach.

 25
Author: Dan Dascalescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Spróbuj getTimezoneOffset() z Date obiektu:

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

Ta metoda zwraca przesunięcie strefy czasowej w minutach, co jest różnicą między czasem GMT a czasem lokalnym w minutach.

 13
Author: dfa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-09 06:26:46

JavaScript:

var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
 9
Author: زياد,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-30 01:16:04

Z momentem.js :

moment().format('zz');
 7
Author: kolypto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-11 10:30:53

Z momentjs , Możesz znaleźć bieżącą strefę czasową jako

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>

Z dayjs , Możesz znaleźć bieżącą strefę czasową jako

console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/[email protected]/dayjs.min.js"></script>

Oba API zwracają przesunięcie utc w minutach.

 6
Author: Fizer Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-19 08:32:23

Strefa czasowa w godzinach -

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

Jeśli chcesz być precyzyjny, jak wspomniałeś w komentarzu, powinieneś spróbować w ten sposób -

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));
}
 4
Author: Abrar Jahin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-27 19:10:30

Zobacz ten operator wynikowy był przeciwny do strefy czasowej. więc zastosuj jakąś funkcję matematyczną, a następnie zatwierdź liczbę mniejszą lub większą.

Tutaj wpisz opis obrazka

Zobacz dokument MDN

var a = new Date().getTimezoneOffset();

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

console.log(res)
 3
Author: prasanth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-18 14:07:48
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;
}
Na przykład: Thu Jun 21 2018 18: 12: 50 GMT + 0530 (India Standard Time)

O / P: +0530

 3
Author: Chandrakanth Gowda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-21 12:51:30

Spróbuj tego,

new Date().toString().split("GMT")[1].split(" (")[0]
 3
Author: Srinivasan Sekar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-29 13:28:32

Spróbuj tego:

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

To będzie szukać strefy czasowej w przeglądarce klienta.

 3
Author: Saurabh Talreja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-22 10:03:36

Jeśli potrzebujesz tylko skrótu strefy czasowej "MST" lub "EST":

function getTimeZone(){
    var now = new Date().toString();
    var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
    return timeZone;
}
console.log(getTimeZone());
 3
Author: JohnP2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-22 16:33:10

Ta wartość pochodzi z maszyny użytkownika i może być zmieniona w dowolnym momencie, więc myślę, że to nie ma znaczenia, chcę tylko uzyskać przybliżoną wartość, a następnie przekonwertować ją na GMT na moim serwerze.

Na przykład, jestem z Tajwanu i zwraca "+8 " dla mnie.

Przykład roboczy

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>

Wynik

+8
 2
Author: Terry Lin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-09 07:04:54

Na new Date() możesz uzyskać offset, aby uzyskać nazwę strefy czasowej, którą możesz zrobić:

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

Otrzymujesz wartość pomiędzy () na końcu daty, czyli nazwy strefy czasowej.

 2
Author: Moysés Lacerda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 16:21:06

To byłoby moje rozwiązanie:




    // For time zone:
    const timeZone = /\((.*)\)/.exec(new Date().toString())[1];
    
    // Offset hours:
    const offsetHours = new Date().getTimezoneOffset() / 60;
    
    console.log(`${timeZone}, ${offsetHours}hrs`);
 2
Author: Abhish Abraham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-21 15:08:02

Jako alternatywę dla new Date().getTimezoneOffset() i moment().format('zz'), Możesz również użyć momentjs:

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 jest również dość buggy i unmainted ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )

 1
Author: brauliobo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-30 17:21:50

Użyj tego do konwersji offsetu na postive:

var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
 1
Author: Kumal Pereira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-24 08:09:13

Jeśli chcesz tylko strefę czasową (jak IST, GMT, itp.), następnie użyj tego:

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); });
 0
Author: cmcodes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-08 16:54:45

Kiedyś miałem to "proste" zadanie i użyłem (new Date()).getTimezoneOffset() - podejścia, które jest szeroko sugerowane tutaj. Okazało się jednak, że rozwiązanie nie było do końca właściwe. Z kilku nieudokumentowanych powodów w moim przypadku new Date() wracał GMT+0200 Kiedy new Date(0) wracał GMT+0300 co było słuszne. Od tego czasu zawsze używam

(new Date(0)).getTimezoneOffset() aby uzyskać prawidłowy timeshift.

 0
Author: pluto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-03 17:47:12

Ty tylko po to, aby włączyć moment.js i 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>

A potem

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

</script>
 -4
Author: Dayachand Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 14:04:28

To dla mnie bardzo dobra robota:

// Translation to offset in Unix Timestamp
let timeZoneOffset = ((new Date().getTimezoneOffset())/60)*3600;
 -4
Author: Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-23 21:08:34

Możesz po prostu spróbować tego. zwróci ci bieżący czas maszyny

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

 -5
Author: user8066707,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-25 18:10:07

To wystarczy.


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

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

Undefined

 -5
Author: SysMurff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-25 18:35:16