JavaScript Date构造函数传入不同日期字符串的异常行为咨询
JavaScript Date构造函数解析日期字符串的差异原因
问题现象
你遇到的差异来自JavaScript对不同格式日期字符串的解析规则不同,先看你的代码和运行结果:
示例代码
<div>Date 1: <span id="mydate1"></span></div> <div>Date 2: <span id="mydate2"></span></div> <div>Date 3: <span id="mydate3"></span></div> <script> document.getElementById("mydate1").innerHTML = (new Date("2022-06-28 20:32:00")).toString(); document.getElementById("mydate2").innerHTML = (new Date("2022-06-28")).toString(); document.getElementById("mydate3").innerHTML = (new Date("2022-06-28 00:00:00")).toString(); </script>
运行结果
Date 1: Tue Jun 28 2022 20:32:00 GMT-0400 (Eastern Daylight Time) Date 2: Mon Jun 27 2022 20:00:00 GMT-0400 (Eastern Daylight Time) Date 3: Tue Jun 28 2022 00:00:00 GMT-0400 (Eastern Daylight Time)
核心原因
这是ECMAScript标准规定的解析逻辑:
- 仅日期的ISO格式(
YYYY-MM-DD):规范要求将这种字符串解析为UTC时区的午夜(00:00:00)。你的本地时区是GMT-0400,所以UTC的6月28日00:00转换为本地时间就是6月27日20:00,对应Date2的结果。 - 带时间的非严格ISO格式(比如
YYYY-MM-DD HH:mm:ss用空格分隔):这种格式不属于严格的ISO 8601标准(严格标准用T分隔日期和时间,比如2022-06-28T20:32:00),JS引擎会默认按本地时区解析。所以Date1和Date3都按本地时间处理,得到预期的结果。
注意:如果是严格ISO带
T的格式(比如2022-06-28T00:00:00),同样会被解析为UTC时间,转换为本地时间后也会出现Date2类似的偏移。
规避方案
你提到的追加00:00:00是有效的,因为它把格式变成了带时间的非严格ISO,强制引擎按本地时区解析。另外还有两种更可靠的写法:
- 直接传入年、月、日参数(注意月份是从0开始计数,6月对应5):
// 本地时间2022年6月28日00:00:00 new Date(2022, 5, 28).toString(); - 明确指定UTC时间(如果需要基于UTC处理):
// UTC时间2022年6月28日00:00:00,转换为本地时间展示 new Date(Date.UTC(2022, 5, 28)).toString();
内容的提问来源于stack exchange,提问作者Dave Hubbard
相关产品推荐
相关产品推荐

