Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get timezone abbreviation using offset value

Using moment.js (with moment-timezone), I want to get the timezone abbreviation (e.g. PST) for the current locale.

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

How do I get the timezone abbreviation? All of the examples I have seen in the docs and elsewhere pick a specific region like "America/New_York".

From the docs, it looks like I can get the information out of the Zone Object with zone.abbr(timestamp) but I'm not sure how to access the zone object.

JSFiddle

like image 712
thetallweeks Avatar asked Feb 06 '15 21:02

thetallweeks


People also ask

How do I find offset time zone?

You can get the offset of a timezone using ZonedDateTime#getOffset . Note that the offset of a timezone that observes DST changes as per the changes in DST. For other places (e.g. India), it remains fixed. Therefore, it is recommended to mention the moment when the offset of a timezone is shown.

How do you get time zone abbreviation in moment?

For example, if you parse the string '2020/01/02' and then call the moment#tz() method, you're telling moment to parse the string in the locale time, and then convert the date to a given IANA timezone. // '20200101 21:00 PST' moment('2020/01/02', 'YYYY/MM/DD'). tz('America/Los_Angeles'). format('YYYYMMDD HH:mm z');


1 Answers

The title and the question are different. In the title, you ask how to get it using the offset - which would not be possible. There are many time zones that share the same offset, so it isn't possible to distinguish a time zone abbreviation from an offset alone.

But in the question, you asked how to get the abbreviation for the current locale, for a specific timestamp.

The general problem is, there is no fully-reliable way to detect the current time zone. This is discussed in this answer. So moment-timezone can't deterministically tell which time zone should be loaded by default.

There are some other options available though.

Current browsers / node

In current browsers, the ECMAScript Internationalization API extensions are supported on the toLocaleString function of the Date object. When supported, you can do this:

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

In current browsers, you'll get a value like "EST". You might want to do some sort of tests though, because it won't work in all browsers.

Use jsTimeZoneDetect

You could use a script like jsTimeZoneDetect to guess at the local time zone. It's usually correct, but not guaranteed. You could then pass that value to moment-timezone.

    var tzName = jstz.determine().name();
    var m = moment();
    var abbr = m.tz(tzName).zoneAbbr();  // or .format('z')

Use moment-timezone

There is also now built-in support for time zone detection/guessing in moment-timezone:

    var tzName = moment.tz.guess();
    var abbr = m.tz(tzName).zoneAbbr();  // or .format('z')
like image 165
Matt Johnson-Pint Avatar answered Sep 28 '22 22:09

Matt Johnson-Pint