为何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
相关产品推荐
相关产品推荐

