You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,强制引擎按本地时区解析。另外还有两种更可靠的写法:

  1. 直接传入年、月、日参数(注意月份是从0开始计数,6月对应5):
    // 本地时间2022年6月28日00:00:00
    new Date(2022, 5, 28).toString();
    
  2. 明确指定UTC时间(如果需要基于UTC处理):
    // UTC时间2022年6月28日00:00:00,转换为本地时间展示
    new Date(Date.UTC(2022, 5, 28)).toString();
    

内容的提问来源于stack exchange,提问作者Dave Hubbard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:40:39