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

为何date.getMonth()获取月份偏差1个月?求全球通用解决方案

Date对象月份偏差问题解析与全球通用解决方案

问题原因

当你执行new Date('2020-04')时,JavaScript会默认把这个日期解析为UTC时间的2020年4月1日00:00:00。你所在的加利福尼亚州属于太平洋时区,夏令时期间比UTC晚7小时,非夏令时晚8小时,所以UTC的4月1日零点对应加州本地时间的3月31日下午4点或5点——此时本地时间仍处于3月。

而getMonth()方法返回的是本地时间的月份(注意:JavaScript的月份从0开始计数,0代表1月),所以此时会返回2,加1后得到3。而getUTCMonth()返回的是UTC时间的月份,UTC时间此时是4月,返回3,加1后得到4,结果自然正确。

全球通用解决方案

要保证无论用户在哪个时区,都能准确获取指定的4月,有三种可靠方案:

  • 方案1:始终基于UTC时间处理
    直接使用getUTCMonth()方法获取UTC时间的月份,因为new Date('YYYY-MM')默认解析为UTC当月第一天,基于UTC处理能规避时区差异:

    let date = new Date('2020-04');
    let month = date.getUTCMonth() + 1; // 始终返回4
    
  • 方案2:显式指定UTC时区解析
    在日期字符串末尾添加T00:00:00Z,明确告诉JavaScript按UTC时间解析,避免本地时区转换:

    let date = new Date('2020-04T00:00:00Z');
    let month = date.getUTCMonth() + 1; // 全球任意时区都返回4
    
  • 方案3:直接从字符串提取月份(最稳妥)
    完全不依赖Date对象的时区处理,直接拆分日期字符串提取月份,彻底避免时区问题:

    const dateStr = '2020-04';
    let month = parseInt(dateStr.split('-')[1], 10); // 直接得到4
    

内容的提问来源于stack exchange,提问作者Kumar Desai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:52:44