Как получить 7 дней в неделю с текущей датой в JavaScript? - PullRequest
4 голосов
/ 29 февраля 2012

(во-первых, извините за мой плохой английский, я новичок)

У меня есть график процентов по дате. Я хотел бы отображать каждый день текущей недели по оси 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 недели спустя ...

Итак, у вас есть лучшее решение для меня, или, может быть, вы могли бы просто помочь мне и сказать, в чем проблема.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 29 февраля 2012

Боюсь, вы попали в одну из многочисленных ловушек объектной мутации. :)

Проблема в том, что в строке "var nextday = ..." вы меняете дату, сохраненную в "curr" на каждой итерации, вызывая setDate () . Это не проблема, если next находится в диапазоне текущего месяца; curr.setDate (next) эквивалентно движению вперед на один в этом случае.

Проблемы начинаются, когда next достигает 30. 30 февраля нет , К сожалению, следующая итерация вызывает curr.setDate (31) , а curr - 1 марта (помните, что объект, на который ссылается curr , изменяется в каждая итерация) мы получаем ... 31 марта! Другие странные значения могут быть объяснены таким же образом.

Способ исправить это - скопировать curr на каждую итерацию и затем вызвать setDate (), например:

for (var i = 1; i < 7; i++) {
    var next = new Date(curr.getTime());
    next.setDate(first + i);
    alert(next.toString());
}
1 голос
/ 01 марта 2012

Спасибо всем, Я понял, что каждый раз, когда я меняю значение 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());                            
}

Еще раз, спасибо вам всем за ваши быстрые ответы и вашу помощь!

0 голосов
/ 29 февраля 2012

Проблема в том, что вы изменяете дату 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);
}

​
0 голосов
/ 29 февраля 2012

Вы можете добавить date и day. Первый из них имеет значение от 1 до 28..31, а второй - от 0 до 6. Что должен делать тип Date, если для даты установлено значение -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 ) );
    ...
}
...