我的网络应用客户端从rest api服务器接收JSON数据。
数据包含时区字符串值,如“Etc / GMT-1”。
对于计算时间,我需要提取时区数(就像-1)。
如果我使用parseInt(timezone);
,则返回值为NaN
。
我不确定moment.js是否可以处理此格式并提取GMT编号。 我认为时区数据格式可能很灵活。 所以,我更喜欢使用moment.js。
有没有办法用moment.js提取数字?
答案 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;