Jak mogę zebrać informacje o strefie czasowej użytkownika? Potrzebuję strefy czasowej, a także godzin przesunięcia GMT.
Jak mogę zebrać informacje o strefie czasowej użytkownika? Potrzebuję strefy czasowej, a także godzin przesunięcia GMT.
Odpowiedzi:
var offset = new Date().getTimezoneOffset();
console.log(offset);
Przesunięcie strefy czasowej to różnica w minutach między czasem UTC i czasem lokalnym. Należy pamiętać, że oznacza to, że przesunięcie jest dodatnie, jeśli lokalna strefa czasowa znajduje się za UTC, a ujemne, jeśli jest do przodu. Na przykład, jeśli Twoja strefa czasowa to UTC + 10 (Australian Eastern Standard Time), wartość -600 zostanie zwrócona. Czas letni zapobiega temu, aby wartość ta była stała nawet dla danego regionu
Pamiętaj, że nie wszystkie strefy czasowe są przesunięte o całe godziny: na przykład Nowa Fundlandia ma UTC minus 3h 30m (pozostawiając czas letni poza równaniem).
getTimezoneOffset
niedokładności? Artykuł, do którego się odwołujesz, pochodzi z czerwca 2007 r. I nie zawiera szczegółowych informacji na temat niedokładności funkcji. W rzeczywistości jsTimezoneDetect
wskazana biblioteka getTimezoneOffset
sama się używa .
var hrs = -(new Date().getTimezoneOffset() / 60)
aby uzyskać przesunięcie w godzinach zwykle używanych
timezone
! =utc offset
Użycie przesunięcia do obliczenia strefy czasowej jest niewłaściwym podejściem i zawsze będziesz mieć problemy. Strefy czasowe i reguły dotyczące czasu letniego mogą zmieniać się kilkakrotnie w ciągu roku i trudno jest nadążyć za nimi.
Aby uzyskać strefę czasową IANA systemu w JavaScript, powinieneś użyć
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
ecma-402 / 1.0 mówi, że timeZone
może być niezdefiniowany, jeśli nie zostanie przekazany konstruktorowi. Jednak przyszły projekt (3.0) rozwiązał ten problem, zmieniając domyślną strefę czasową systemu.
W tej wersji interfejsu API internacjonalizacji ECMAScript
timeZone
właściwość pozostanie niezdefiniowana, jeśli żadnatimeZone
właściwość nie zostanie podana w obiekcie opcji przekazanym doIntl.DateTimeFormat
konstruktora . Jednak aplikacje nie powinny na tym polegać, ponieważ przyszłe wersje mogą zwracać wartość typu String identyfikującą bieżącą strefę czasową środowiska hosta.
w ecma-402 / 3.0, który jest wciąż w wersji roboczej, zmieniono na
W tej wersji interfejsu API internacjonalizacji ECMAScript 2015
timeZone
właściwość będzie nazwą domyślnej strefy czasowej, jeśli żadnatimeZone
właściwość nie zostanie podana w obiekcie opcji przekazanym doIntl.DateTimeFormat
konstruktora. Poprzednia wersja pozostawiłatimeZone
właściwość niezdefiniowaną w tym przypadku.
Zdaję sobie sprawę, że ta odpowiedź jest nieco nie na temat, ale wyobrażam sobie, że wielu z nas szukających odpowiedzi również chciało sformatować strefę czasową do wyświetlania i być może również uzyskać skrót strefy. No i proszę…
Jeśli chcesz, aby strefa czasowa klienta była ładnie sformatowana, możesz polegać na metodzie Date.toString JavaScript i wykonać:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
To da ci na przykład „GMT-0400 (EST)”, w tym minuty strefy czasowej, jeśli dotyczy.
Alternatywnie za pomocą wyrażenia regularnego możesz wyodrębnić dowolną część:
W przypadku „GMT-0400 (EDT)”:
new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]
W przypadku „GMT-0400”:
new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]
Tylko „EDT”:
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
Tylko „-0400”:
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Odwołanie do Date.toString: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
split[4] + " " + split[5]
?!
split
zawiera: ["Mon", "Mar", "13", "2017", "14:05:22", "GMT-0400", "(Eastern", "Daylight", "Time)"]
więc wynik toDaylight Time)
new Date().toString()
jest całkowicie zależna od ustawień regionalnych. Oczekiwanie, że wyniki innych klientów będą podobne do twoich, jest bardzo złym pomysłem.
Odpowiedzieliśmy już, jak uzyskać przesunięcie w minutach jako liczbę całkowitą, ale na wypadek, gdyby ktoś chciał lokalnego przesunięcia GMT jako ciągu, 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))
pad(parseInt(Math.abs(offset/60)), 2)
aby zrobić to dobrze ... w przeciwnym razie możesz dostać +5.530, jak w moim przypadku ... nie jestem pewien, czy podłoga matematyczna itp. Będzie lepsza, czy nie ... ale to co najmniej daje mi +0530 zgodnie z oczekiwaniami
Możesz użyć:
<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 w przeglądarce jest dość trudne, aby uzyskać właściwy wynik, ponieważ przeglądarka zapewnia niewiele informacji.
Moment Strefa czasowa wykorzystuje Date.getTimezoneOffset()
i Date.toString()
przez kilka chwil w ciągu bieżącego 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ń zwracana jest strefa czasowa z miastem o największej liczbie mieszkańców.
console.log(moment.tz.guess()); // America/Chicago
W swoim projekcie napisałem funkcję, która zwraca strefę czasową w hh:mm
formacie. Mam nadzieję, że może to 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
Jednowierszowy, który podaje zarówno przesunięcie, jak i strefę czasową, to po prostu wywołanie metody toTimeString () na nowym obiekcie Date. Z MDN:
toTimeString()
Metoda zwraca część czasu obiekt Date w postaci czytelnej dla człowieka w amerykańskim angielskim.
Problem polega na tym, że strefa czasowa nie ma standardowego formatu IANA; jest nieco bardziej przyjazny dla użytkownika niż format IANA „kontynent / miasto” . Wypróbuj to:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
Obecnie w Kalifornii toTimeString()
zwraca, Pacific Daylight Time
gdy wraca interfejs API Intl America/Los_Angeles
. W Kolumbii dostaniesz Colombia Standard Time
kontra America/Bogota
.
Zauważ, że wiele innych odpowiedzi na to pytanie próbuje uzyskać te same informacje, wywołując Date.toString (). To podejście nie jest tak niezawodne, jak wyjaśnia MDN :
Instancje daty odnoszą się do określonego momentu w czasie. Wywołanie metody toString () zwróci datę sformatowaną w czytelnej dla człowieka formie w amerykańskim angielskim. [...] Czasami pożądane jest uzyskanie ciągu czasu; coś takiego można osiągnąć za pomocą
toTimeString()
metody.
toTimeString()
Metoda jest szczególnie użyteczna, ponieważ silniki zgodne wykonawcze ECMA 262 może różnić się w ciągu otrzymanego ztoString()
oDate
obiektach, w odniesieniu do formatu jest zależne od implementacji; proste metody cięcia łańcuchów mogą nie dawać spójnych wyników dla wielu silników.
JavaScript:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
Z moment.js :
moment().format('zz');
Z
iZZ
Z momentjs, możesz znaleźć aktualną 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źć aktualną strefę czasową jako
console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>
Oba API zwracają przesunięcie utc w ciągu kilku minut.
getTimezoneOffset()
.
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));
}
Jeśli wszystko, czego potrzebujesz, to skrót strefy czasowej „MST” lub „EST”:
function getTimeZone(){
var now = new Date().toString();
var timeZone = now.replace(/.*[(](.*)[)].*/,'$1');//extracts the content between parenthesis
return timeZone;
}
Date.toString()
nie jest niezawodne, a MDN wyjaśnia, dlaczego. Mam wklejony odpowiednią sekcję z ich docs w mojej odpowiedzi .
Zobacz, jak ten wynikowy operator był odwrotny do strefy czasowej. Więc zastosuj jakąś funkcję matematyczną, a następnie sprawdź liczbę mniejszą lub większą.
var a = new Date().getTimezoneOffset();
var res = -Math.round(a/60)+':'+-(a%60);
res = res < 0 ?res : '+'+res;
console.log(res)
round
? Powinno być floor
, prawda?
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;
}
Przykład: czw. 21 czerwca 2018 18:12:50 GMT + 0530 (czas standardowy w Indiach)
O / P: +0530
Date.toString()
nie jest niezawodne, a MDN wyjaśnia, dlaczego. Mam wklejony odpowiednią sekcję z ich docs w mojej odpowiedzi .
Spróbuj tego,
new Date().toString().split("GMT")[1].split(" (")[0]
Ta wartość pochodzi z komputera użytkownika i można ją zmienić 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 mi „+8”.
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
Na new Date(
) możesz uzyskać przesunięcie, aby uzyskać nazwę strefy czasowej, którą możesz zrobić:
new Date().toString().replace(/(.*\((.*)\).*)/, '$2');
otrzymasz wartość pomiędzy ()
końcem daty, czyli nazwą strefy czasowej.
Date.toString()
nie jest niezawodne, a MDN wyjaśnia, dlaczego. Mam wklejony odpowiednią sekcję z ich docs w mojej odpowiedzi . Odpowiedź ta została już udzielona co najmniej 3 razy.
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`);
Jako alternatywę dla new Date().getTimezoneOffset()
i moment().format('zz')
możesz także 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ść błędny i nieobsługiwany ( https://bitbucket.org/pellepim/jstimezonedetect/issues?status=new&status=open )
Użyj tego, aby przekonwertować OffSet na postive:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
Szukałem tylko trzyliterowego ciągu znaków (jak „PDT”) i wypróbowałem odpowiedź Marqueza, ale musiałem ją nieco ulepszyć, aby obsługiwała wiele przeglądarek. Na szczęście ciąg znaków jest ostatnim potencjalnym dopasowaniem :)
Oto co zrobiłem w CoffeeScript:
browserTimezone = ->
userDate = new Date()
zoneMatches = userDate.toString().match(/([A-Z][A-Z][A-Z])/g)
userZone = zoneMatches[zoneMatches.length - 1]
Działa w IE8, IE9, Safari 9, Firefox 44 i Chrome 48
Date.toString()
nie jest niezawodne, a MDN wyjaśnia, dlaczego. Mam wklejony odpowiednią sekcję z ich docs w mojej odpowiedzi .
Musisz tylko dołą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>
i potem
<script>
$(function(){
var currentTimezone = jstz.determine();
var timezone = currentTimezone.name();
alert(timezone);
});
</script>
możesz po prostu tego spróbować. zwróci ci aktualny czas maszyny
var _d = new Date(), t = 0, d = new Date(t*1000 + _d.getTime())
new Date(new Date().getTime());
wyświetli się: „Pt 28 grudnia 2018 10:15:23 GMT + 0100 (środkowoeuropejski standardowy czas) {}”