§8. «Датская арифметика» или вычисления с датами

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

Задавая отрицательное значение n, получим вычитание. Внимательно читайте комментарий в начале функции.

Date.prototype.add=function(n,t)
// прибавляет к дате n дней, месяцев или лет

// t может быть равно 'd','day','days' для дней;
//   'm','month','months' для месяцев;
//   'y','year','years' для лет

// t еще может быть равно 'm-1d','month-1day','months-1day'
//   - прибавить n месяцев и отнять один день

// t еще может быть равно 'y-1d','year-1day','years-1day'
//   - прибавить n лет и отнять один день

// если t не указано или имеет иное значение, используется 'd'

// при ошибке возвращает false
{
  var r=new Date(this);
  var q='';

  if (typeof(n)=='number')
    if (n.isInt())
    {
      if (typeof(t)=='string') q=t.toUpperCase();

      switch(q)
      {
        case 'M':
        case 'MONTH':
        case 'MONTHS':
          r.setMonth(r.getMonth()+n);
          break;

        case 'M-1D':
        case 'MONTH-1DAY':
        case 'MONTHS-1DAY':
          r.setMonth(r.getMonth()+n);
          if (n>=0)
            r.setDate(r.getDate()-1);
          else
            r.setDate(r.getDate()+1);
          break;

        case 'Y':
        case 'YEAR':
        case 'YEARS':
          r.setFullYear(r.getFullYear()+n);
          break;

        case 'Y-1D':
        case 'YEAR-1DAY':
        case 'YEARS-1DAY':
          r.setFullYear(r.getFullYear()+n);
          if (n>=0)
            r.setDate(r.getDate()-1);
          else
            r.setDate(r.getDate()+1);
          break;

        default:
          r.setDate(r.getDate()+n);
      }
      return r;
    }
  return false;
}

После подключения этого кода возможно использование нового метода для любого объекта Date.

Например, так:

var d=new Date();
var d1,d2,d3;

d1=d.add(1,'month-1day');
d2=d.add(-18,'years');
d3=d.add(30,'days');

Не забудьте скачать и подключить всю библиотеку, так как метод Date.add() опирается на некоторые другие методы.

1 комментарий

  1. В моей практике на php были часто очень полезны функции начала и конца дня (выдающие таймстемп), ну и начало-конец недели, месяца и т.д.

    Ну и с точки зрения стороннего программиста d2=d.add(-18,’years’); это круто, но вызывает когнитивный диссонанс. Я бы предпочел substract, вместо add отрицательное число.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *