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?
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?
Odpowiedzi:
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, timeZone
właściwość jest ustawiona na, undefined
a 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.
Większość pozytywnych odpowiedzi jest prawdopodobnie najlepszym sposobem na uzyskanie strefy czasowej, jednak Intl.DateTimeFormat().resolvedOptions().timeZone
zwraca 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 Date
reprezentacji 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.
Możesz użyć tego skryptu. http://pellepim.bitbucket.org/jstz/
Repozytorium forkuj lub klonuj tutaj. https://bitbucket.org/pellepim/jstimezonedetect
Po dołączeniu skryptu możesz uzyskać listę stref czasowych w - jstz.olson.timezones
zmiennej.
Poniższy kod służy do określenia strefy czasowej przeglądarki klienta.
var tz = jstz.determine();
tz.name();
Ciesz się jstz!
Pobierz strefę czasową według nazwy (np. „Ameryka / Nowy Jork”)
moment.tz.guess();
Intl.DateTimeFormat().resolvedOptions().timeZone
Intl.DateTimeFormat().resolvedOptions().timeZone
zwraca undefined
, ale moment.tz.guess()
zwraca poprawną wartość
Możesz po prostu napisać własny kod, korzystając z tabeli mapowania tutaj: http://www.timeanddate.com/time/zones/
lub użyj biblioteki momentów i stref czasowych: http://momentjs.com/timezone/docs/
Widzieć zone.name; // America/Los_Angeles
lub ta biblioteka: https://github.com/Canop/tzdetect.js
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ł.
UTC
/ GMT
. Wygląda na to, że inne są przeliterowane; np Pacific Daylight Time
.
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>
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