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



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



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

1173   28  

28 ответов:

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

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

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

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);

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

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

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

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);

получи момент.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 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;

мне нравится делать математику в миллисекундах. Так что используйте 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

B. Вы начинаете с базовой даты 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 addDays(date, days) {
    return new Date(
        date.getFullYear(),
        date.getMonth(),
        date.getDate() + days,
        date.getHours(),
        date.getMinutes(),
        date.getSeconds(),
        date.getMilliseconds()
    );
}

Я нахожу проблему с методом 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 день расчетов.

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

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);

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

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

простой способ управления датами является использование момент.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);

Docs http://momentjs.com/docs/#/manipulating/add/

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

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));

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

использовать 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 addDays( date, days ) {
    var dateInMs = date.setDate(date.getDate() - days);
    return new Date(dateInMs);
}

var date_from = new Date();
var date_to = addDays( new Date(), parseInt(days) );

Вы можете использовать Javascript.

var CurrDate = new Date(); // Current Date
var numberOfDays = 5;
var days = CurrDate.setDate(CurrDate.getDate() + numberOfDays);
alert(days); // It will print 5 days before today

для PHP

$date =  date('Y-m-d', strtotime("-5 days")); // it shows 5 days before today.
echo $date;

надеюсь, что это поможет вам.

var d = new Date();

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

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

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

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

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

var d = new Date();

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

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

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

без использования второй переменной, вы можете заменить 7 Для с вашей задней x дней

пусть d=новая дата (new Date ().getTime() - (7 * 24 * 60 * 60 * 1000))

я преобразовал в миллисекунду и вычитал дни еще месяц и год не изменится и логично

var numberOfDays = 10;//number of days need to deducted or added
var date = "01-01-2018"// date need to change
var dt = new Date(parseInt(date.substring(6), 10),        // Year
              parseInt(date.substring(3,5), 10) - 1, // Month (0-11)
              parseInt(date.substring(0,2), 10));
var new_dt = dt.setMilliseconds(dt.getMilliseconds() - numberOfDays*24*60*60*1000);
new_dt = new Date(new_dt);
var changed_date = new_dt.getDate()+"-"+(new_dt.getMonth()+1)+"-"+new_dt.getFullYear();

надеюсь поможет

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

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, "-");

var date = new Date();
var day = date.getDate();
var mnth = date.getMonth() + 1;

var fDate = day + '/' + mnth + '/' + date.getFullYear();
document.write('Today is: ' + fDate);
var subDate = date.setDate(date.getDate() - 1);
var todate = new Date(subDate);
var today = todate.getDate();
var tomnth = todate.getMonth() + 1;
var endDate = today + '/' + tomnth + '/' + todate.getFullYear();
document.write('<br>1 days ago was: ' + endDate );
var daysToSubtract = 3;
$.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ;
var my date = new Date().toISOString().substring(0, 10);

он может дать вам только дата, как 2014-06-20. надеюсь поможет

Comments

    Ничего не найдено.