如何在JavaScript中将日期时间字符串转换为UTC日期
JS ISO时间字符串转UTC日期解决方案
请问如何在JavaScript中将
"2011-09-30T00:00:00"日期时间字符串转换为UTC日期?
我尝试使用new Date("2011-09-30T00:00:00")进行转换,但输出结果为"2011-09-29T23:00:00.000Z",不符合预期。
问题根因
不带时区标识的YYYY-MM-DDTHH:mm:ss格式字符串,在现代JS规范中默认会按照运行环境的本地时区解析。你拿到的输出结果,实际是你所在时区的2011-09-30 00:00对应的UTC时间,和你期望的「把输入字符串直接作为UTC时间解析」的逻辑不符。
可用解决方案
方案1:追加UTC标识(最简方案,兼容现代浏览器)
直接在输入字符串末尾添加Z标识,告知JS引擎该字符串为UTC时区时间,解析后即可得到预期结果:
const utcDate = new Date("2011-09-30T00:00:00Z"); console.log(utcDate.toISOString()); // 输出:2011-09-30T00:00:00.000Z
方案2:拆分后用Date.UTC生成(兼容全版本浏览器)
如果需要兼容旧版浏览器,可手动拆分时间字段后通过Date.UTC生成UTC时间戳,再转为Date对象:
const timeStr = "2011-09-30T00:00:00"; // 拆分日期和时间部分 const [datePart, timePart] = timeStr.split("T"); const [year, month, day] = datePart.split("-").map(Number); const [hour, minute, second] = timePart.split(":").map(Number); // Date.UTC接收的月份为0-based,需减1 const utcDate = new Date(Date.UTC(year, month - 1, day, hour, minute, second)); console.log(utcDate.toISOString()); // 输出:2011-09-30T00:00:00.000Z
注意事项
- 不要依赖不带时区标识的字符串解析逻辑,旧版本IE等浏览器存在解析差异,部分会默认当做UTC时间处理,和现代浏览器行为不一致,以上两种方案兼容性更稳定。
- 后续如果需要获取UTC时间的年月日时分秒字段,要调用
getUTCFullYear()、getUTCMonth()、getUTCDate()等getUTC*系列方法,不要使用普通get*方法,后者会返回本地时区对应的数值。
内容的提问来源于stack exchange,提问作者developer
相关产品推荐
相关产品推荐

