JS按时区转换本地时间为UTC时结果反向偏差不符合预期
问题原因
你的代码逻辑和预期需求完全反向,存在两处核心错误:
new Date('2022-07-04 12:30')解析无时区标识的日期字符串时,JS会默认将其识别为代码运行环境所在时区的本地时间,转为内部存储的UTC时间戳,并不会按你传入的America/Los_Angeles时区解析。toLocaleTimeString的作用是基于Date对象内部存储的固定UTC时间戳,输出该时间点在你传入的timeZone参数对应时区的本地显示时间。你当前的代码实际执行逻辑是:把运行环境本地时间的2022-07-04 12:30,转成洛杉矶时区的显示时间,输出的4:30本质是你本地12:30时对应的洛杉矶当地时间,和你要实现的「洛杉矶当地12:30转UTC时间」的需求完全反向。
修正代码
要实现指定时区本地时间转UTC时间,需要先计算目标时区和UTC的偏移量,再做时间换算,修正后的实现如下:
public dateTimeToTime(dateStr, timezone = 'UTC') { // 拆分传入的日期、时间字段,避免非标准日期字符串的解析歧义 const [datePart, timePart] = dateStr.split(' '); const [year, month, day] = datePart.split('-').map(Number); const [hour, minute] = timePart.split(':').map(Number); // 构造初始时间对象,Date的月份参数从0开始计数,需要减1 const initDate = new Date(Date.UTC(year, month - 1, day, hour, minute)); // 取初始时间在目标时区下的格式化字符串,计算时区偏移差 const timeInTargetZone = new Date(initDate.toLocaleString('en-US', { timeZone: timezone, hour12: false })); const offset = initDate.getTime() - timeInTargetZone.getTime(); // 偏移修正后得到对应的UTC时间,按格式输出 const utcDate = new Date(initDate.getTime() + offset); return utcDate.toLocaleTimeString('en-GB', { timeZone: 'UTC', hour12: false }); }
调用该方法传入'2022-07-04 12:30', 'America/Los_Angeles'时,7月是洛杉矶夏令时,UTC比洛杉矶时间快7小时,最终输出结果为20:30:00,和预期一致。
注意:不要直接使用
new Date('yyyy-MM-dd HH:mm')格式解析时间,该字符串属于非ISO标准格式,不同运行环境的解析逻辑存在差异,容易出现时区偏移错误。
内容的提问来源于stack exchange,提问作者Talktomegoose
相关产品推荐
相关产品推荐

