2015-02-06 8 views
11

Korzystanie z pliku moment.js (ze strefą czasową), chcę uzyskać skrót strefy czasowej (np. PST) dla bieżących ustawień narodowych.Skrót strefy czasowej za pomocą wartości przesunięcia

var now = Date.now(); // 1423254073931 
var zone = moment(now).zone(); // 480 
var timezone = 

Jak uzyskać skrót strefy czasowej? Wszystkie przykłady, które widziałem w dokumentach i innych miejscach, wybierają określony region, taki jak "America/New_York".

Z dokumentów wygląda na to, że mogę uzyskać informacje z Zone Object z zone.abbr(timestamp), ale nie jestem pewien, jak uzyskać dostęp do obiektu strefy.

JSFiddle

+0

Nie można użyć '/\(([^)]+)\)/.exec(new Date()) [1]'? –

+0

@RobRaisch Nie sądzę, że będzie działać w przeglądarce. Na przykład jest to wynikiem 'nowej daty' w Firefox:' 2015-02-06T23: 40: 57.085Z' – thetallweeks

+0

W rzeczywistości wynikiem 'new Date()' jest nowa instancja obiektu Date, który pojawia się FF drukować na konsoli w niestandardowym formacie. Tak więc zamiast powyższego możesz '/\(([^)]+)\)/.exec((new Date()). ToString()) [1]' który tutaj w Bostonie zwraca "Eastern Standard Time" " –

Odpowiedz

25

Tytuł i są od siebie różne. W tytule pytasz, jak zdobyć go za pomocą offsetu - co nie byłoby możliwe. Istnieje wiele stref czasowych, które mają takie samo przesunięcie, więc nie można odróżnić skrótu strefy czasowej od samego przesunięcia.

Ale w pytaniu zapytano, jak uzyskać skrót dla bieżącego locale, dla określonego znacznika czasu.

Ogólny problem polega na tym, że nie ma w pełni niezawodnego sposobu wykrywania bieżącej strefy czasowej. Jest to omówione w this answer. Strefa czasowa nie może więc deterministycznie określić, która strefa czasowa powinna być załadowana domyślnie.

Dostępne są jednak inne opcje.

  • W niektórych przeglądarkach, rozszerzenia ECMAScript Internationalization API są obsługiwane przez funkcję toLocaleString obiektu Date. Obsługiwany, możesz to zrobić (bez chwili):

    var d = new Date(); // or whatever date you have 
    var tzName = d.toLocaleString('en', {timeZoneName:'short'}).split(' ').pop(); 
    

    W obsługiwanych przeglądarkach otrzymasz wartość, np. "EST". Możesz jednak wykonać jakieś testy, ponieważ nie będzie działać we wszystkich przeglądarkach.

  • Można użyć skryptu takiego jak jsTimeZoneDetect do odgadnięcia w lokalnej strefie czasowej. Jest to poprawna, ale nie gwarantowana, poprawka zazwyczaj. Następnie możesz przekazać tę wartość do strefy czasowej.

    var tzName = jstz.determine().name(); 
    var m = moment(); 
    var abbr = m.tz(tzName).zoneAbbr(); // or .format('z') 
    
  • Istnieje również teraz wbudowane wsparcie dla wykrywania strefy czasowej/zgadywania w moment-timezone:

    var tzName = moment.tz.guess(); 
    var abbr = m.tz(tzName).zoneAbbr(); // or .format('z') 
    
+0

Dobrze o tym wiedzieć. Wcześniej sądziłem, że offset jest wyjątkowy, więc można go użyć do uzyskania strefy czasowej. – thetallweeks

+0

Najnowsza wersja strefy czasowej również zawiera domysły stref czasowych. – RonyK

5

Najnowsze kompilacji moment.js dałyby się domyślić Strefa czasowa: PR#220 na przykład: moment.tz.guess(); will result in 'America/New_York'