2015-02-06 61 views
11

使用moment.js(带时刻),我想获取当前语言环境的时区缩写(例如PST)。使用偏移值获取时区缩写

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

如何获取时区缩写?我在文档和其他地方看到的所有示例都选择了一个特定区域,如"America/New_York"

从文档看来,我可以通过Zone Objectzone.abbr(timestamp)获取信息,但我不确定如何访问区域对象。

JSFiddle

+0

而且你不能使用'/\(([[))+)\)/.exec(new Date())[1]'? – 2015-02-06 21:45:01

+0

@RobRaisch我不认为这将跨浏览器工作。例如,这是Firefox中'new Date'的结果:'2015-02-06T23:40:57.085Z' – thetallweeks 2015-02-06 23:42:54

+0

实际上,'new Date()'的结果是FF出现的Date对象的新实例以非标准格式打印到控制台。因此,而不是上述,你可以'/\(([[)]+)\)/.exec((new Date())。toString())[1]'这里在波士顿,返回“东部标准时间“ – 2015-02-06 23:52:07

回答

25

标题,问题是不同的。在标题中,你问如何使用偏移量来获得 - 这是不可能的。有许多时区共享相同的偏移量,因此无法单独区分时差缩写和偏移量。

但在问题中,您问了如何获取当前语言环境的缩写,针对特定的时间戳。

一般问题是,没有完全可靠的方式来检测当前时区。这在this answer中讨论。所以时区时区不能确定地告诉哪个时区应该默认加载。

虽然有一些其他选项可用。

  • 在一些浏览器,ECMAScript Internationalization API延伸支撑在Date对象的toLocaleString功能。如果支持,就可以做到这一点(没有片刻):

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

    在支持的浏览器,你会得到像“EST”的值。尽管你可能想做某种测试,因为它不适用于所有的浏览器。

  • 你可以使用像jsTimeZoneDetect这样的脚本来猜测当地时区。这是通常正确,但不能保证。然后,您可以将该值传递给时区 - 时区。

    var tzName = jstz.determine().name(); 
    var m = moment(); 
    var abbr = m.tz(tzName).zoneAbbr(); // or .format('z') 
    
  • 还有就是现在也内置支持时区的检测/在moment-timezone猜测:

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

这是很好的知道。之前我曾认为偏移量是独一无二的,所以它可以用来获取时区。 – thetallweeks 2015-02-10 18:58:14

+0

瞬时时区的最新版本也包含时区猜测。 – RonyK 2016-03-15 12:38:48

5

最新moment.js会给你时区的猜测编译: PR#220 例如:moment.tz.guess(); will result in 'America/New_York'