Get timezone abbreviation using offset value
Latest build of moment.js would give you timezone guess:
PR#220
for example: moment.tz.guess(); will result in 'America/New_York'
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')