Jak mogę uzyskać nazwę strefy czasowej w JavaScript?

118

Wiem, jak uzyskać przesunięcie strefy czasowej, ale potrzebuję możliwości wykrycia czegoś takiego jak „Ameryka / Nowy Jork”. Czy jest to w ogóle możliwe z poziomu JavaScript, czy jest to coś, co będę musiał gościć w oparciu o przesunięcie?

Mike Thomsen
źródło
2
Oto funkcja, którą napisał Jon Nylander, być może pomaga bitbucket.org/pellepim/jstimezonedetect
yunzen
Oto powiązana odpowiedź, która może pomóc: stackoverflow.com/a/19421672/1447034
Douglas

Odpowiedzi:

243

W Internacjonalizacja API obsługuje coraz strefę czasową użytkownika i jest obsługiwany we wszystkich obecnych przeglądarkach.

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

Należy pamiętać, że w niektórych starszych wersjach przeglądarek, które obsługują interfejs API internacjonalizacji, timeZonewłaściwość jest ustawiona na, undefineda nie na ciąg strefy czasowej użytkownika. O ile wiem, w chwili pisania tego tekstu (lipiec 2017 r.) Wszystkie obecne przeglądarki z wyjątkiem IE11 będą zwracać strefę czasową użytkownika jako ciąg.

Daniel Compton
źródło
6
Nigdy nie sądziłem, że to takie proste
Mohammed Shareef C,
5
niesamowity, pierwszy, który widziałem, który nie wykorzystuje chwili! Dzięki
r0bb077
3
Niesamowite rozwiązanie. Nie chciałem uwzględniać w tym celu wtyczki strefy czasowej całego momentu.
Joan Gil
1
bardzo proste i przyjemne rozwiązanie!
blackiii
2
@DanielCompton och, nie wiedziałem o tej tabeli, dzięki za ponowne poprawienie.
CommonSenseCode
9

Większość pozytywnych odpowiedzi jest prawdopodobnie najlepszym sposobem na uzyskanie strefy czasowej, jednak Intl.DateTimeFormat().resolvedOptions().timeZonezwraca nazwę strefy czasowej IANA z definicji, która jest w języku angielskim.

Jeśli chcesz, aby nazwa strefy czasowej była w języku bieżącego użytkownika, możesz ją przeanalizować z Datereprezentacji ciągu w następujący sposób:

function getTimezoneName() {
  const today = new Date();
  const short = today.toLocaleDateString(undefined);
  const full = today.toLocaleDateString(undefined, { timeZoneName: 'long' });

  // Trying to remove date from the string in a locale-agnostic way
  const shortIndex = full.indexOf(short);
  if (shortIndex >= 0) {
    const trimmed = full.substring(0, shortIndex) + full.substring(shortIndex + short.length);
    
    // by this time `trimmed` should be the timezone's name with some punctuation -
    // trim it from both sides
    return trimmed.replace(/^[\s,.\-:;]+|[\s,.\-:;]+$/g, '');

  } else {
    // in some magic case when short representation of date is not present in the long one, just return the long one as a fallback, since it should contain the timezone's name
    return full;
  }
}

console.log(getTimezoneName());

Przetestowano w Chrome i Firefox.

Oczywiście to nie zadziała zgodnie z przeznaczeniem w niektórych środowiskach. Na przykład node.js zwraca przesunięcie GMT (np. GMT+07:00) Zamiast nazwy. Ale myślę, że jest nadal czytelny jako rozwiązanie awaryjne.

PS nie będzie działać w IE11, tak samo jak Intl...rozwiązanie.

mrnateriver
źródło
3

Pobierz strefę czasową według nazwy (np. „Ameryka / Nowy Jork”)

moment.tz.guess();
Omer
źródło
10
Proszę wspomnieć, że jest to również po prostu możliwe bez żadnych zależności:Intl.DateTimeFormat().resolvedOptions().timeZone
user2923322
1
Tak, chociaż moment-js również zgaduje TZ dla "przeglądarek", które nie obsługują tej funkcji. :)
Ferran Maylinch
w IE11 Intl.DateTimeFormat().resolvedOptions().timeZonezwraca undefined, ale moment.tz.guess()zwraca poprawną wartość
Antoni4
0

To pobiera kod strefy czasowej (np. GMT) W starszym javascript (używam skryptu aplikacji Google ze starym silnikiem):

function getTimezoneName() {
  return new Date().toString().get(/\((.+)\)/);
}

Umieszczam to tutaj na wypadek, gdyby ktoś tego potrzebował.

toddmo
źródło
1
Myślę, że to działa tylko dla UTC/ GMT. Wygląda na to, że inne są przeliterowane; np Pacific Daylight Time.
Ian Dunn
-1

Wypróbuj ten kod, odwołaj się stąd

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jstimezonedetect/1.0.4/jstz.min.js">
</script>
<script type="text/javascript">
  $(document).ready(function(){
    var tz = jstz.determine(); // Determines the time zone of the browser client
    var timezone = tz.name(); //'Asia/Kolhata' for Indian Time.

    alert(timezone);
});
</script>
Kumar Shanmugam
źródło
-5

W javascript metoda Date.getTimezoneOffset () zwraca przesunięcie strefy czasowej z czasu UTC w minutach dla bieżących ustawień regionalnych.

var x = new Date();
var currentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;

Przydatnym narzędziem będzie Moment'timezone. http://momentjs.com/timezone/

Konwertuj daty między strefami czasowymi

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00
user3345614
źródło
4
Nie zrozumiałeś que.
srsajid
3
Twoje próbki kodu nie są związane z pierwotnym pytaniem. Jak użyłbyś tej biblioteki do zwrócenia nazwy bieżącej strefy czasowej użytkownika?
Joe White