5

(首先,对不起我的英语不好,我是初学者)

我有一个按日期计算的百分比图表。我想在 x 轴上显示本周的每一天。

所以,我试图找到如何获得一周中的 7 天。这就是我所拥有的:

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 周后……

那么,您对我有更好的解决方案吗,或者您可以帮助我并说出问题所在。

谢谢!

4

5 回答 5

3

恐怕你已经掉入了众多对象变异的陷阱之一。:)

问题是,在“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());
}
于 2012-02-29T15:43:19.433 回答
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());                            
}

再次感谢大家的快速解答和帮助!

于 2012-03-01T08:52:59.940 回答
0

您可以添加dateday。前者从 1 到 28..31,后者从 0 到 6。如果将日期设置为 -3,Date 类型应该做什么?

解决方案是将所有值转换为毫秒。

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 ) );
    ...
}
于 2012-02-29T15:40:05.267 回答
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);
}

​
于 2012-02-29T15:42:43.713 回答
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);

jsfidde:https ://jsfiddle.net/sinh_nguyen/v9kszn2h/4/

于 2020-08-12T04:31:17.777 回答