Добавление / вычитание дней из даты не меняет год / месяц правильно - PullRequest
8 голосов
/ 01 декабря 2010

Если у меня есть дата 2011-01-02 и я вычитаю 7 дней с этой даты, она должна дать мне 2010-12-26, но вместо этого она дает мне 2011-01-26?

См. JS ниже для проверки по ссылке:

var date = new Date('2011','01','02');
alert('the original date is '+date);
var newdate = new Date(date);
newdate = newdate.setDate(newdate.getDate() - 7);
var nd = new Date(newdate);
alert('the new date is '+nd);

http://jsbin.com/upeyu/6

Ответы [ 5 ]

20 голосов
/ 01 декабря 2010

Я думаю, что вы хотели сделать это: (работает отлично)

var date = new Date('2011','01','02');
alert('the original date is '+date);
var newdate = new Date(date);
newdate.setDate(newdate.getDate() - 7);
var nd = new Date(newdate);
alert('the new date is '+nd);

jsFiddle пример

4 голосов
/ 01 декабря 2010

getDate() и setDate() оба обозначают только день месяца, часть даты.Чтобы вычесть 7 дней, вы хотите сделать это:

myDate.setDate( myDate.getDate() - 7 );

Это устанавливает день месяца в день месяца минус семь.Если вы в конечном итоге используете отрицательное число, оно возвращается к предыдущему месяцу.

2 голосов
/ 01 декабря 2010

.getDate () возвращает только день месяца, а .setDate () устанавливает только ДЕНЬ месяца, а не дату.

Попробуйте сделать

var date = new Date('2011','01','02');
alert('the original date is '+date);
var newdate = new Date(date.getTime() - 604800000);
alert('the new date is '+newdate);
0 голосов
/ 05 февраля 2016

я написал служебную программу Date.prototype.subDuration = subDuration;function subDuration (a, b) {if ((typeof a === 'string') && (typeof b === 'number')) {if ((a === "Add") || (a === "Sub")) {subdur.call (this, a, b)} else {return false;}}

                function subdur(action,days){
                   switch (action){
                      case 'Add': 
                      addDays.call(this,days);
                      break;
                      case 'Sub': 
                      rmvDays.call(this,days)
                      break;
                      default:
                      return false;
                   }
                   function addDays(days){
                        this.setDate(this.getDate()+days)
                   };
                   function rmvDays(days){
                        this.setDate(this.getDate()-days);
                   };
                }


            }

            var d = new Date('2011','00','02');
            alert(d);
            d.subDuration('Add',2);
            alert(d);
            d.subDuration('Sub',3);
            alert(d);
0 голосов
/ 01 декабря 2010

Это потому, что метод setDate является всего лишь предполагаемым для установки дня месяца

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...