如何用moment-timezone获取指定日期及时区的UTC偏移量?
如何获取指定日期及时区对应的UTC偏移量?
我需要处理用户输入的日期与时区(如“America/Los Angeles”),并将其转换为UTC时间,但这需要获取该日期对应时区的UTC偏移量。由于夏令时的存在,UTC偏移量会随日期变化。我尝试使用以下代码:
var tzOffset = moment.tz("3/11/2018 3:00 AM", "America/Los_Angeles").utcOffset(); document.write('utc offset is : ' + tzOffset + '<br/>') ;但得到的结果是480,正确值应为420。使用parseZone方法可以得到正确结果:
var tzOffset2 = moment.parseZone("3/11/2018 3:00 AM -07:00").utcOffset(); document.write('utc offset2 is : ' + tzOffset2 + '<br/>') ;但该方法需要预先知晓偏移量,请问如何正确获取指定日期(如“3/11/2018 3:00 AM”)和时区(如“America/Los_Angeles”)对应的UTC偏移量?
其实你踩了moment.tz的一个常见小坑——参数顺序和格式指定的问题!
你之前写的moment.tz(dateString, timezone)写法,moment会默认把dateString按照本地时区来解析,之后再转换到你指定的America/Los_Angeles时区。而3月11日正好是美国夏令时切换的节点,这种先本地解析再转时区的操作,会导致解析出来的时间点不是你原本想要的那个,自然偏移量就错了。
正确的做法是,明确告诉moment你的日期字符串格式,让它直接在目标时区里解析这个时间,正确的调用格式是:
moment.tz(dateString, dateFormat, timezone);
针对你的例子,调整后的代码应该是这样:
// 指定日期格式为M/D/YYYY h:mm A,匹配输入的"3/11/2018 3:00 AM" var tzOffset = moment.tz("3/11/2018 3:00 AM", "M/D/YYYY h:mm A", "America/Los_Angeles").utcOffset(); console.log('utc offset is : ' + tzOffset); // 输出420,对应-07:00,符合夏令时偏移量
如果你不想把格式写在tz方法里,也可以先创建moment对象指定格式,再切换到目标时区,效果是一样的:
var tzOffset = moment("3/11/2018 3:00 AM", "M/D/YYYY h:mm A").tz("America/Los_Angeles").utcOffset();
核心就是必须指定日期格式,让moment准确解析你输入的时间为目标时区的本地时间,这样就能正确获取到该时间点对应的UTC偏移量,完全不需要预先知道偏移值~
内容的提问来源于stack exchange,提问作者sdjuan
相关产品推荐
相关产品推荐

