JavaScript中如何根据月份和时区获取正确的当月首尾日期(yyyy-mm-dd格式)
JavaScript中如何根据月份和时区获取正确的当月首尾日期(yyyy-mm-dd格式)
嘿,我明白你遇到的困扰了——明明代码逻辑看着没问题,却拿不到预期的2024-10-01和2024-10-31对吧?先看看你写的代码:
var year = 2024; var month = 9; // October var firstDay = new Date(year, month, 1); firstDate = firstDay.toISOString().split('T')[0]; document.getElementById("a").innerHTML = firstDay+" | "+firstDate; var lastDay = new Date(year, month+1, 0); lastDate = lastDay.toISOString().split('T')[0]; document.getElementById("b").innerHTML = lastDay+" | "+lastDate;
<p id="a"></p> <p id="b"></p>
问题确实出在**时区(GMT/UTC)**上!你用的toISOString()方法会把日期转换成UTC时区的字符串,举个例子,如果你的本地时区是东八区(比UTC早8小时),那本地时间的2024-10-01 00:00:00,转换成UTC就是2024-09-30 16:00:00,拆分后自然就变成了2024-09-30,这就是你拿到意外结果的原因。
给你两种靠谱的解决办法:
方法一:手动拼接日期字符串(最直接,避开时区坑)
既然我们已经明确知道年份、月份和目标日期,直接按格式拼接就好,完全不用依赖时区相关的转换:
var year = 2024; var month = 9; // Date对象的月份是0基,9对应10月 // 处理当月第一天,月份要+1,不足两位补0 var firstDate = `${year}-${String(month + 1).padStart(2, '0')}-01`; // 先拿到当月最后一天的日期数字,再补0拼接 var lastDay = new Date(year, month + 1, 0); var lastDate = `${year}-${String(month + 1).padStart(2, '0')}-${String(lastDay.getDate()).padStart(2, '0')}`; document.getElementById("a").innerHTML = firstDate; document.getElementById("b").innerHTML = lastDate;
方法二:调整时区偏移后再转换字符串
如果你一定要用toISOString(),可以先把日期的时区偏移量加回去,确保转换后的UTC字符串对应本地的正确日期:
var year = 2024; var month = 9; var firstDay = new Date(year, month, 1); // 加上时区偏移(getTimezoneOffset返回本地与UTC的分钟差,东八区是-480,加回去相当于抵消时区差) firstDay.setMinutes(firstDay.getMinutes() + firstDay.getTimezoneOffset()); var firstDate = firstDay.toISOString().split('T')[0]; var lastDay = new Date(year, month + 1, 0); lastDay.setMinutes(lastDay.getMinutes() + lastDay.getTimezoneOffset()); var lastDate = lastDay.toISOString().split('T')[0]; document.getElementById("a").innerHTML = firstDay+" | "+firstDate; document.getElementById("b").innerHTML = lastDay+" | "+lastDate;
这样就能得到你想要的2024-10-01和2024-10-31啦~
备注:内容来源于stack exchange,提问作者Francesco G.
相关产品推荐
相关产品推荐

