Вычтите дни из даты в JavaScript

Кто-нибудь знает легкий способ взять дату (например, сегодня) и вернуться на X дней?

Так, например, если я хочу вычислить дату за 5 дней до сегодняшнего дня.

41 ответ

Решение

Попробуйте что-то вроде этого:

 var d = new Date();
 d.setDate(d.getDate()-5);

Обратите внимание, что это изменяет объект даты и возвращает значение времени обновленной даты.

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 5);

document.write('<br>5 days ago was: ' + d.toLocaleString());

var dateOffset = (24*60*60*1000) * 5; //5 days
var myDate = new Date();
myDate.setTime(myDate.getTime() - dateOffset);

Если вы выполняете множество непростых манипуляций с датами в своем веб-приложении, DateJS сделает вашу жизнь намного проще:

http://simonwillison.net/2007/Dec/3/datejs/

Это выглядит примерно так:

var d = new Date(); // today!
var x = 5; // go back 5 days!
d.setDate(d.getDate() - x);

Если вы хотите, чтобы все это было в одной строке.

5 дней с сегодняшнего дня

//past
var thirtyDaysAgo = new Date(new Date().setDate(new Date().getDate() - 5));
//future
var thirtyDaysInTheFuture = new Date(new Date().setDate(new Date().getDate() + 5));

5 дней с определенной даты

 var pastDate = new Date('2019-12-12T00:00:00');

 //past
 var thirtyDaysAgo = new Date(new Date().setDate(pastDate.getDate() - 5));
 //future
 var thirtyDaysInTheFuture = new Date(new Date().setDate(pastDate.getDate() + 5));

Я написал функцию, которую вы можете использовать.

function AddOrSubractDays(startingDate, number, add) {
  if (add) {
    return new Date(new Date().setDate(startingDate.getDate() + number));
  } else {
    return new Date(new Date().setDate(startingDate.getDate() - number));
  }
}

console.log('Today : ' + new Date());
console.log('Future : ' + AddOrSubractDays(new Date(), 5, true));
console.log('Past : ' + AddOrSubractDays(new Date(), 5, false));

Я заметил, что getDays+ X не работает за пределами дня / месяца. Использование getTime работает до тех пор, пока ваша дата не раньше 1970 года.

var todayDate = new Date(), weekDate = new Date();
weekDate.setTime(todayDate.getTime()-(7*24*3600000));

Я нахожу проблему с методом getDate()/setDate() в том, что он слишком легко превращает все в миллисекунды, и мне иногда сложно следовать синтаксису.

Вместо этого мне нравится отрабатывать тот факт, что 1 день = 86 400 000 миллисекунд.

Итак, для вашего конкретного вопроса:

today = new Date()
days = 86400000 //number of milliseconds in a day
fiveDaysAgo = new Date(today - (5*days))

Работает как шарм.

Я все время использую этот метод для расчета 30/60/365 дней.

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

Получить момент.js. Все классные дети используют это. У него больше опций форматирования и т. Д. Где

var n = 5;
var dateMnsFive = moment(<your date>).subtract(n , 'day');

Необязательный! Конвертировать в JS Date obj для угловой привязки.

var date = new Date(dateMnsFive.toISOString());

Необязательный! Формат

var date = dateMnsFive.format("YYYY-MM-DD");

Некоторые из существующих решений были близки, но не совсем то, что я хотел. Эта функция работает как с положительными, так и с отрицательными значениями и обрабатывает граничные случаи.

function addDays(date, days) {
    return new Date(
        date.getFullYear(),
        date.getMonth(),
        date.getDate() + days,
        date.getHours(),
        date.getMinutes(),
        date.getSeconds(),
        date.getMilliseconds()
    );
}

Не используя вторую переменную, вы можете заменить 7 на назад x дней

let d= новая дата (новая дата ().getTime() - (7 * 24 * 60 * 60 * 1000))

Я сделал этот прототип для Date, чтобы можно было передавать отрицательные значения для вычитания дней и положительные значения для добавления дней.

if(!Date.prototype.adjustDate){
    Date.prototype.adjustDate = function(days){
        var date;

        days = days || 0;

        if(days === 0){
            date = new Date( this.getTime() );
        } else if(days > 0) {
            date = new Date( this.getTime() );

            date.setDate(date.getDate() + days);
        } else {
            date = new Date(
                this.getFullYear(),
                this.getMonth(),
                this.getDate() - Math.abs(days),
                this.getHours(),
                this.getMinutes(),
                this.getSeconds(),
                this.getMilliseconds()
            );
        }

        this.setTime(date.getTime());

        return this;
    };
}

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

var date_subtract = new Date().adjustDate(-4),
    date_add = new Date().adjustDate(4);

Мне нравится делать математику в миллисекундах. Так что используйте Date.now()

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds

и если вам нравится это отформатировано

new Date(newDate).toString(); // or .toUTCString or .toISOString ...

НОТА: Date.now() не работает в старых браузерах (например, IE8, я думаю). Полифилл здесь.

ОБНОВЛЕНИЕ Июнь 2015

@socketpair указал на мою небрежность. Как он / она говорит: "В некоторых днях в году есть 23 часа, а в некоторых 25 из-за правил часового пояса".

Более того, в ответе выше будут неточности для перехода на летнее время в том случае, если вы хотите рассчитать МЕСТНЫЙ день 5 дней назад в часовом поясе с изменениями для перехода на летнее время, и вы

  • предположить (ошибочно), что Date.now() дает вам текущее местное время, или
  • использование .toString() которая возвращает локальную дату и поэтому несовместима с Date.now() базовая дата в UTC.

Тем не менее, это работает, если вы все делаете математику в UTC, например,

A. Вы хотите дату UTC 5 дней назад от СЕЙЧАС (UTC)

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds UTC
new Date(newDate).toUTCString(); // or .toISOString(), BUT NOT toString

Б. Вы начинаете с базовой даты UTC, отличной от "сейчас", используя Date.UTC()

newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000;
new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString

Разбить вашу дату на части, а затем вернуть новую дату с установленными значениями

function DateAdd(date, type, amount){
    var y = date.getFullYear(),
        m = date.getMonth(),
        d = date.getDate();
    if(type === 'y'){
        y += amount;
    };
    if(type === 'm'){
        m += amount;
    };
    if(type === 'd'){
        d += amount;
    };
    return new Date(y, m, d);
}

Помните, что месяцы начинаются с нуля, а дни - нет. т.е. новая дата (2009, 1, 1) == 01 февраля 2009 года, новая дата (2009, 1, 0) == 31 января 2009 года;

Некоторые люди предлагали использовать moment.js, чтобы упростить вам жизнь при работе с датами в js. Прошло время с тех пор, как эти ответы были и примечательно, что даны,авторы moment.js не одобряют его использование . В основном из-за своего размера и отсутствия опоры для деревьев.

Если вы хотите пойти по пути библиотеки, используйте альтернативу, например Luxon . Он значительно меньше (из-за умного использования объекта Intl и поддержки встряхивания дерева) и такой же универсальный, как moment.js.

Чтобы вернуться на 5 дней назад в Луксоне, вы должны:

      import { DateTime } from 'luxon'

DateTime.now().minus({ days: 5 });

function addDays (date, daysToAdd) {
  var _24HoursInMilliseconds = 86400000;
  return new Date(date.getTime() + daysToAdd * _24HoursInMilliseconds);
};

var now = new Date();

var yesterday = addDays(now, - 1);

var tomorrow = addDays(now, 1);

Посмотрите следующий код, вычтите дни из текущей даты. Кроме того, установите месяц в соответствии с вычтенной датой.

var today = new Date();
var substract_no_of_days = 25;

today.setTime(today.getTime() - substract_no_of_days* 24 * 60 * 60 * 1000);
var substracted_date = (today.getMonth()+1) + "/" +today.getDate() + "/" + today.getFullYear();

alert(substracted_date);

Используйте MomentJS.

function getXDaysBeforeDate(referenceDate, x) {
  return moment(referenceDate).subtract(x , 'day').format('MMMM Do YYYY, h:mm:ss a');
}

var yourDate = new Date(); // let's say today
var valueOfX = 7; // let's say 7 days before

console.log(getXDaysBeforeDate(yourDate, valueOfX));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

Я создал функцию для манипулирования датами. Вы можете добавить или вычесть любое количество дней, часов, минут.

function dateManipulation(date, days, hrs, mins, operator) {
   date = new Date(date);
   if (operator == "-") {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() - durationInMs);
   } else {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() + durationInMs);
   }
   return newDate;
 }

Теперь вызовите эту функцию, передав параметры. Например, вот вызов функции для получения даты до 3 дней с сегодняшнего дня.

var today = new Date();
var newDate = dateManipulation(today, 3, 0, 0, "-");

Мне нравится следующее, потому что это одна строка. Не идеально подходит для изменений DST, но обычно достаточно для моих нужд.

var fiveDaysAgo = new Date(new Date() - (1000*60*60*24*5));

Простой способ управлять датами - использовать Moment.js

Ты можешь использовать add, пример

var startdate = "20.03.2014";
var new_date = moment(startdate, "DD.MM.YYYY");
new_date.add(5, 'days'); //Add 5 days to start date
alert(new_date);

Документы http://momentjs.com/docs/

Лучшие ответы привели к ошибке в моем коде, когда в первом месяце он установил будущую дату в текущем месяце. Вот что я сделал,

curDate = new Date(); // Took current date as an example
prvDate = new Date(0); // Date set to epoch 0
prvDate.setUTCMilliseconds((curDate - (5 * 24 * 60 * 60 * 1000))); //Set epoch time

Для меня все комбинации работали нормально с приведенным ниже фрагментом кода, фрагмент для реализации Angular-2, если вам нужно добавить дни, передайте положительное число дней, если вам нужно вычесть передать отрицательное число дней

function addSubstractDays(date: Date, numberofDays: number): Date {
let d = new Date(date);
return new Date(
    d.getFullYear(),
    d.getMonth(),
    (d.getDate() + numberofDays)
);
}

Я получаю хороший пробег от даты.js:

http://www.datejs.com/

d = new Date();
d.add(-10).days();  // subtract 10 days

Ницца!

Сайт включает в себя эту красоту:

Datejs не просто разбирает строки, он аккуратно разбивает их на две части

Если вы хотите вычесть количество дней и отформатировать дату в удобочитаемом формате, подумайте о создании пользовательского DateHelper объект, который выглядит примерно так:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Subtract 5 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -5));

(см. также эту скрипку)

Использование современного синтаксиса функции JavaScript

const getDaysPastDate = (daysBefore, date = new Date) => new Date(date - (1000 * 60 * 60 * 24 * daysBefore));

console.log(getDaysPastDate(1)); // yesterday

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 100);

document.write('<br>100 days ago was: ' + d.toLocaleString());

Первый аргумент — это начальная дата, а второй — сколько дней вы хотите увеличить или уменьшить до даты.

пример (1)- передать -1, чтобы уменьшить дату на один день

пример (2)- передать 1, чтобы увеличить дату на один день

      const EditDay = (date: Date, num: number): Date => {
 return new Date(date.getTime() + num * 24 * 60 * 60 * 1000)
}

Чтобы вычислить относительные отметки времени с более точной разницей, чем целые дни, вы можете использовать Date.getTime () и Date.setTime () для работы с целыми числами, представляющими количество миллисекунд с определенной эпохи, а именно с 1 января 1970 года. Например, если вы хотите узнать, когда сейчас наступит 17 часов:

ссылка

Я сделал простую функцию для быстрого расчета логики «время назад».

      /**
 * Helper function to calculate "xx times ago"
 * 
 * @param timestamp The Unix timestamp in milliseconds to compare against the current (now) timestamp
 * @returns The date formatted in "time ago". E.g. 7 days ago
 */
function calcTimeAgo (timestamp) {
  const now = new Date().getTime()
  const diff = now - timestamp

  let text

  if (diff < 60000) {
    text = 'moments'
  } else if (diff < 3.6e+6) {
    const min = Math.round((diff) / 60000)
    text = min === 1
      ? `${min} minute`
      : `${min} minute`
  } else if (diff < 8.64e+7) {
    const hours = Math.round((diff) / 3.6e+6)
    text = hours === 1
      ? `${hours} hour`
      : `${hours} hours`
  } else {
    const days = Math.round((diff) / 8.64e+7)
    text = days === 1
      ? `${days} day`
      : `${days} days`
  }

  return `${text} ago`
}

calcTimeAgo(new Date() - 2.592e+8) // returns "3 days ago"

Использование jQuery:

minDate: новая дата(),minDate:-NumberOfDays

var today = new Date();
var tmpDate = new Date();
var i = -3; var dateArray = [];
while( i < 4 ){
    tmpDate = tmpDate.setDate(today.getDate() + i);
  tmpDate = new Date( tmpDate );
  var dateString = ( '0' + ( tmpDate.getMonth() + 1 ) ).slice(-2) + '-' + ( '0' + tmpDate.getDate()).slice(-2) + '-' + tmpDate.getFullYear();
    dateArray.push( dateString );
    i++;
}
console.log( dateArray );
Другие вопросы по тегам