(首先,抱歉我的英语不好,我是初学者)
我有按日期百分比的图表。我想在x轴上显示本周的每一天。
所以,我试图找到如何获得一周中的七天。 这就是我所拥有的:
var curr = new Date; // get current date
var first = curr.getDate() - curr.getDay();//to set first day on monday, not on sunday, first+1 :
var firstday = (new Date(curr.setDate(first+1))).toString();
for(var i = 1;i<7;i++){
var next = first + i;
var nextday = (new Date(curr.setDate(next))).toString();
alert(nextday);
}
警报开始很好......直到月底。这就是我得到的:
1 : "Mon 27 Feb 2012 ..."
2 : "Tue 28 Feb 2012 ..."
3 : "Wed 29 Feb 2012 ..."
4 : "Thu 01 Mar 2012 ..."
5 : "Sat 31 Mar 2012 ..."
6 : "Sun 01 Apr 2012 ..."
所以,正如你所看到的那样,它会改变星期五......奇怪的是,它会转换为好日期... 4周之后......
那么,你有没有更好的解决方案,或者你可以帮助我并说出问题所在。
谢谢!
答案 0 :(得分:2)
我担心你已陷入众多物体变异的陷阱中。 :)
问题是,在“var nextday = ...”行中,您通过调用 setDate()在每次迭代中更改“curr”中保存的日期。只要 next 在当前月份的范围内,那就没问题了;在这种情况下, curr.setDate(next)相当于前进一个。
问题在 next 达到30时开始。没有2月30日,所以 setDate()包裹到下个月,产生3月1日 - 到目前为止超好的。不幸的是,下一次迭代调用 curr.setDate(31),而 curr 是3月1日(请记住 curr 引用的对象每次迭代都会改变),我们得到...... 3月31日!其他奇怪的值可以用同样的方式解释。
解决此问题的方法是在每次迭代时复制 curr ,然后然后调用setDate(),如下所示:
for (var i = 1; i < 7; i++) {
var next = new Date(curr.getTime());
next.setDate(first + i);
alert(next.toString());
}
答案 1 :(得分:1)
谢谢大家,
我明白每次更改curr
值时都会出现问题。
你所有的解决方案都在工作,但我更喜欢最简单的一个,一个来自@denisw的解决方案,我将其复制给其他有同样问题的人:
var curr = new Date; // get current date
var first = curr.getDate() - curr.getDay();
var firstday = (new Date(curr.setDate(first+1))).toString();
for(var i = 1; i < 7; i++) {
var next = new Date(curr.getTime());
next.setDate(first+i);
alert(next.toString());
}
再次感谢大家,感谢您的快速解答和帮助!
答案 2 :(得分:0)
您可以添加date
和day
。前者从1到28..31,后者从0到6.如果将日期设置为-3,日期类型应该怎么做?
解决方案是将所有值转换为毫秒。
var ONE_DAY_IN_MILLIS = 1000*60*60*24;
var curr = new Date();
// Get offset to first day of week
// Note: Depending on your locale, 0 can be Sunday or Monday.
var offset = curr.getDay() * ONE_DAY_IN_MILLIS;
// Date at the start of week; note that hours, minutes and seconds are != 0
var start = new Date( curr.getTime() - offset );
for( var i=0; i<7; i++ ) {
var nextDay = new Date( start.getTime() + ( i * ONE_DAY_IN_MILLIS ) );
...
}
答案 3 :(得分:0)
问题是您正在修改curr
日期并同时创建新日期。有两种方法可以做到这一点:
要么永远不要修改你的curr
日期对象并创建新的日期:
var msInDay = 1000 * 60 * 60 * 24;
function addDays(date, days) {
return new Date(date.getTime() + days * msInDay);
}
var curr = new Date();
var first = addDays(curr, -curr.getDay() + 1);
alert(first);
for(var i = 1; i<7; i++) {
var next = addDays(first, i);
alert(next);
}
或者一致地修改curr
日期对象:
var curr = new Date();
curr.setDate(curr.getDate() - curr.getDay() + 1);
alert(curr);
for(var i = 1; i<7; i++) {
curr.setDate(curr.getDate() + 1);
alert(curr);
}
答案 4 :(得分:0)
let curr = new Date;
let week = []
for (let i = 1; i <= 7; i++) {
let first = curr.getDate() - curr.getDay() + i
let day = new Date(curr.setDate(first)).toISOString().slice(0, 10)
week.push(day)
}
console.log('week:', week);