JavaScript Date对象格式化问题:期望yyyy-mm-dd结果不符如何解决?
解决JavaScript Date对象转yyyy-mm-dd时的日期偏移问题
这个问题的核心是时区差异导致的:
new Date('Aug 5 2022')创建的是基于本地时区的日期对象;- 但
toISOString()方法会强制将日期转换为UTC时区的字符串输出。
如果你的本地时区在UTC以西(比如北美、南美多数地区),本地时间的8月5日00:00,对应的UTC时间其实是8月4日的某个时刻(例如UTC-4时区,本地5日0点=UTC4日20点),所以toISOString()返回的字符串开头是2022-08-04T...,split后自然得到前一天的日期。
下面是几种可靠的解决方法:
方案1:手动构造本地日期字符串(可控性强)
直接调用本地时间的年月日方法拼接,完全避开时区转换:
function getLocalYYYYMMDD(date) { const year = date.getFullYear(); // 月份从0开始计数,需加1;padStart确保格式为两位数字 const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } // 测试 console.log(getLocalYYYYMMDD(new Date('Aug 5 2022'))); // 输出 2022-08-05
方案2:使用Intl.DateTimeFormat(简洁原生API)
利用国际化API直接指定输出格式,默认采用本地时区:
const formattedDate = new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: '2-digit', day: '2-digit' }).format(new Date('Aug 5 2022')); console.log(formattedDate); // 输出 2022-08-05
en-CA区域设置刚好对应yyyy-mm-dd格式,你也可以通过调整options参数自定义格式规则。
若需UTC时区的日期
如果你的需求是获取UTC标准下的yyyy-mm-dd,可改用UTC相关的日期方法:
function getUTCYYYYMMDD(date) { const year = date.getUTCFullYear(); const month = String(date.getUTCMonth() + 1).padStart(2, '0'); const day = String(date.getUTCDate()).padStart(2, '0'); return `${year}-${month}-${day}`; }
内容的提问来源于stack exchange,提问作者Amin
相关产品推荐
相关产品推荐

