【问题标题】:How to get the 7 days in a week with a currentDate in javascript?如何在javascript中使用当前日期获取一周中的7天?
【发布时间】:2012-03-19 02:02:27
【问题描述】:

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

我有一个按日期显示的百分比图表。我想在 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 周后……

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

谢谢!

【问题讨论】:

    标签: javascript date dayofweek weekday


    【解决方案1】:

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

    问题在于,在“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());
    }
    

    【讨论】:

    • 谢谢@denisw,您以真正的教育方式解释了问题所在,我明白了:),您帮助我解决了问题!
    【解决方案2】:

    谢谢大家, 我知道每次我更改 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());                            
    }
    

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

    【讨论】:

      【解决方案3】:

      您可以添加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 ) );
          ...
      }
      

      【讨论】:

      • 实际上 JS 可以很好地处理日期上的溢出/下溢。例如,alert(new Date(2012, 2 /*Mar*/, -1)); 将返回Feb 28, 2012,而alert(new Date(2012, 1 /*Feb*/, 30));Mar 1, 2012
      • 我不想通过这种方式(我知道它存在)。但是非常感谢你,你很好地解释了我的方式,也许以后我会使用它! :)
      【解决方案4】:

      问题是您正在修改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);
      }
      
      ​
      

      【讨论】:

      • 感谢这两种方式,我尝试了@denisw 的单行版本,但你的版本是可以理解的! :)
      【解决方案5】:
      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/

      【讨论】:

        猜你喜欢
        • 2011-04-14
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        • 2023-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-08
        相关资源
        最近更新 更多