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)
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).
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 żadnatimeZone
nieruchomość nie była podane w obiekcie options dostarczonym doIntl.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 nietimeZone
właściwość została dostarczona w obiekcie options dostarczonym doIntl.DateTimeFormat
konstruktor. Poprzednia wersja opuściłatimeZone
właściwość niezdefiniowana w tym przypadku.
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.
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))
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
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());
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:
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:Metoda
toTimeString()
Zwraca część czasu obiektu Date w formie czytelnej dla człowieka w amerykańskim języku angielskim.
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 ztoString()
dla obiektówDate
, ponieważ format jest zależny od implementacji; proste metody cięcia ciągów mogą nie dawać spójnych wyników w wielu silnikach.
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.
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);
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');
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.
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));
}
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ą.
Zobacz dokument MDN
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
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
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]
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.
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());
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.
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
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.
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`);
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 )
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);
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); });
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.
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>
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;
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())
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
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