使用moment.js提取时区编号

时间:2017-07-14 17:59:38

标签: javascript timezone momentjs timezone-offset

我的网络应用客户端从rest api服务器接收JSON数据。

数据包含时区字符串值,如“Etc / GMT-1”。 对于计算时间,我需要提取时区数(就像-1)。 如果我使用parseInt(timezone);,则返回值为NaN

我不确定moment.js是否可以处理此格式并提取GMT编号。 我认为时区数据格式可能很灵活。 所以,我更喜欢使用moment.js。

有没有办法用moment.js提取数字?

4 个答案:

答案 0 :(得分:2)

字符串"Etc/GMT-1"是有效的IANA时区标识符。您可以在in the tzdb sources中找到它the list on Wikipedia。正如in the tzdb commentary指出的那样,这个标志与你的期望相反。这意味着UTC + 1,而不是UTC-1。

您还说:“我认为时区数据格式可能很灵活。”实际上,如果您的数据包含任何tzdb区域标识符,则应假设所有时区标识符也有效,包括更常规的表单,如"America/Los_Angeles""Asia/Shanghai"。因此,您不应该尝试从字符串本身中提取任何内容。

重要的是要记住,虽然某些区域具有单个固定偏移,但大多数区域表示一系列偏移以及它们之间的过渡点。因此,在不考虑时间点的情况下,不应尝试从时区id获取单个偏移量。 the timezone tag wiki在“时区!=偏移”主题下也介绍了这一点。

要将这些内容与moment.js一起使用,您还需要moment-timezone加载项。例如:

var timeZone = 'Etc/GMT-1';  // your time zone

var m = moment.tz(timeZone);  // get the *current* time in the time zone.
// or
var m = moment.tz(input, timeZone); // get a *specific* time in the time zone.
// or
var m = someOtherMomentObject.clone().tz(timeZone); // convert to the time zone.

var n = m.utcOffset();  // 60  (minutes West of GMT at the given point in time)

var s = m.format('Z');  // "+01:00"  (offset as a string in ISO-8601 format)

答案 1 :(得分:0)

如果您还安装了moment-timezone,则可以获得区域的偏移量:

var offsetHours = moment.tz.zone("Etc/GMT-1").offsets[0] / 60

offsetHours变量的值为-1。请注意,我必须除以60,因为API会以分钟为单位返回值。

正如Matt在评论中提醒的那样,通常时区有多个有效的偏移量,具体取决于日期 - 由于夏令时变化甚至政治家决定改变他们国家的偏移量 - 因此最好根据日期获得偏移量具体时刻,如documentation

中所述
moment.tz.zone('Etc/GMT-1').offset(1403465838805);

参数1403465838805是自1970-01-01T00:00Z以来的毫秒数。

特别是对于Etc/GMT时区,没有区别,因为它们没有偏移变化,但对于其他区域,最好立即使用。

答案 2 :(得分:0)

Etc / GMT-1是标准格式。 Apple有相关文档:Documentation

仅供参考,正如this Stackoverflow answear所述,Etc / GMT-1应转换为GMT + 1。 如果您的输入始终是Etc / GMT#,您可以通过编写自己的单行函数来提取它:

function extract(input_string){
    return input_string.substring(input_string.indexOf("Etc/GMT")+7);
}

答案 3 :(得分:0)

有同样的问题所以创建了一个带有[label,value]的数组用于自动完成。享受。



// npm install -S moment-timezone

import moment from 'moment-timezone'
import timezones from '<path-to-node_modules>/node_modules/moment-timezone/data/unpacked/latest.json'

// Build Timezone Array for autocomplete
const TIMEZONES = timezones.zones.map( i => {
  let abbrs = i.abbrs.filter((el, index) => i.abbrs.indexOf(el) === index)
  return { label : `${i.name.replace('_',' ')} ( ${abbrs} )`, value: i.name}
})
&#13;
&#13;
&#13;

Autocomplete Data Array