Moment TimeZone返回错误UTC偏移分钟数问题求助
问题解决:Moment TimeZone 计算UTC偏移及时区缩写错误
问题根源
你代码里的核心问题是没有将用户输入的本地时间绑定到目标时区解析:
moment("2022-11-20 14:00")会以代码运行环境的本地时区解析字符串,生成的时间戳对应本地时区的UTC时间,而非伦敦时区14:00对应的UTC时间。- 后续用伦敦时区计算这个错误时间戳的偏移,自然得到了错误的偏移值和时区缩写。
修正后的代码
直接将用户输入的本地时间解析为目标时区的Moment对象,再从对象中获取正确的偏移和缩写:
// 解析用户输入的本地时间为欧洲/伦敦时区的Moment对象 var startDateTime = moment.tz("2022-11-20 14:00", "Europe/London"); // 获取UTC偏移分钟数(冬令时为0) var offsetMinutes = startDateTime.utcOffset(); // 获取时区缩写(GMT) var timeZoneAbbr = startDateTime.format('z'); console.log(offsetMinutes); // 输出 0 console.log(timeZoneAbbr); // 输出 GMT
动态适配用户时区
如果是通过moment.tz.guess(true)自动识别用户时区,只需替换固定时区为动态值:
var userTimeZone = moment.tz.guess(true); // 解析用户输入的本地时间为其所在时区的Moment对象 var startDateTime = moment.tz("2022-11-20 14:00", userTimeZone); var offsetMinutes = startDateTime.utcOffset(); var timeZoneAbbr = startDateTime.format('z');
关键说明
moment.tz()方法会直接将输入的时间字符串解析为指定时区的本地时间,避免了时区混淆。utcOffset()返回当前时间对应的UTC偏移分钟数,自动适配夏令时/冬令时切换。format('z')输出当前时间对应的时区缩写(如BST/GMT、EST/EDT等),无需手动计算。
内容的提问来源于stack exchange,提问作者Zak
相关产品推荐
相关产品推荐

