如何使用javascript中的当前日期获得一周中的7天?

时间:2012-02-29 15:11:15

标签: javascript date dayofweek weekday

(首先,抱歉我的英语不好,我是初学者)

我有按日期百分比的图表。我想在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周之后......

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

谢谢!

5 个答案:

答案 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)

您可以添加dateday。前者从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);

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