Віднімайте дні з дати в JavaScript


603

Хтось знає про простий спосіб взяти побачення (наприклад, сьогодні) та повернутися до X днів?

Так, наприклад, якщо я хочу обчислити дату за 5 днів до сьогодні.


4
У мене виявились проблеми з використанням прийнятої відповіді. Мабуть, використання негативних значень у setDate () не працює, як очікувалося. Дивіться stackoverflow.com/a/9037132/792287 для іншого (кращого?) Рішення.
vandiedakaf

5
Можливий дублікат: stackoverflow.com/questions/1187824/…
Anderson Green

Відповіді:


961

Спробуйте щось подібне:

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


9
Вихід цього дає мені довгий рядок цілих чисел. Будь-яка ідея, як відформатувати її в 14.05.2012?
користувач525146

162
Зважаючи на те, що це вгорі google, я думаю, я відповів би на вищезазначений коментар: new Date(new Date().setDate(new Date().getDate()-5))- це буде 5 днів тому. У прикладі відповіді переведіть його на нову дату, щоб отримати об’єкт дати. Так new Date(d)це те, що ти хочеш.
Джессі

8
Проблема з цим полягає в тому, що ви можете закінчити значення 00, що не є дійсним значенням на дату.
DominicM

24
setDate(-1)буде встановлено дату останнього дня місяця
Пітер

5
@ user525146 запитав, як відформатувати число, а не те, що таке число. Не потрібно поблажливих відповідей. Для форматування числа, використовуйте один з Дати toStringметодів , таких як toISOString, toDateStringі т.д.
Bad Request

83
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/


23
це кращий випадок, але це може не вдатися до початку / кінця літнього часу. ви не віднімаєте 5 днів, а 5 * 24 години. перший день переходу на літній час складає всього 23 години, а останній - 25 годин. зазвичай це не має значення, але це щось врахувати.
Кіп

11
@Kip Я ненавиджу літній час ... і часові пояси. Усі ми повинні перейти на GMT.
cwallenpoole

6
@cwallenpoole не розриває міхур, але вони використовують DST навіть у Ґрінвічі. Тож якщо ви дійсно хочете бути на GMT, ви обмежені в Ісландії та кількох західноафриканських країнах.
Кіп

1
Проблема цього методу полягає в тому, що він не працює з новим роком тощо.
Даніель Вільямс

4
@danielWilliams Як це не працює з новим роком? getTime()і setTime()є мілісекундами з епохи. Не має значення, чи час перетинає межу року.
Машмагар

52

Виходить приблизно так:

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

Вихід цього дає мені довгий рядок цілих чисел. Будь-яка ідея, як відформатувати її в 14.05.2012?
користувач525146

7
Повернене значення d.setDate - це дійсно ціле значення. Однак ви, мабуть, насправді не зацікавлені у поверненому значенні на даний момент, оскільки фактичне значення "d" було змінено. Ваше справжнє запитання тепер полягає в тому, як відформатувати дату, яка зараз знаходиться в "d", а не взагалі значення повернення setDate. (Ну, насправді це повернене значення, але це не дата до цього моменту, і я не хочу вас плутати - просто використовуйте d, це буде швидше). Для форматування дат потрібні методи d.getMonth (), d.getFullYear () та d.getDate (). Ви хочете додати його до d.getMonth (), оскільки січень 0.
Кріс Нільсен

2
Як простий метод: function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a};тоді простоvar daysAgo45 = getDaysAgo(45);
SpYk3HH

@MiroKrsjak Звичайно, це працює, якщо перетнути кінець / початок місяця. Чому б це не працювало?
Кріс Нільсен

23

Я помітив, що getDays + X не працює за межами дня / місяця. Використання getTime працює до тих пір, поки ваша дата не до 1970 року.

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

3
Я помітив те саме. Я більше здивований, чи ні, я щось пропускаю?
Шон Гловер

11
Це неправильно, новий Date (). SetDate (-1) дасть вам останній день попереднього місяця.
zbrunson

2
Це також неправильно в крайній частині початку / кінця літнього часу. Ваш підхід віднімає 7 * 24 години за умови, що кожен день має 24 години. Перший день DST триває всього 23 години, а останній день - 25 годин. setDate (getDate () - 7) не має цієї проблеми.
Кіп

1
getTime працює поза універсальним часом. Таким чином, буде правильно віднімати 7 днів від об'єкта Date. Коли ви перетворите його на рядок у вказаному часовому поясі, він правильно покаже час для цієї зони.
awjr

Будьте уважні в день зміни часу. Коли ми осінь повернемося назад, у цей день є 25 годин, тож віднімання 24 години з півночі висадимо вас у той же день. Але ця техніка (віднімання мілісекунд) БУДЕ спрацьовувати, якщо округлити день після кожної операції до найближчої півночі. Це можна зробити, спочатку додавши 12 годин, потім встановивши години на нуль.
Чарівний

18

отримати moment.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");

передавши свою дату в момент, ви почнете отримувати попередження. Попередження про депресацію: надане значення не в розпізнаному форматі RFC2822 або ISO. Момент побудови повертається до js Date (), який не є надійним для всіх браузерів та версій. Формати дат, що не належать до RFC2822 / ISO, не відмовляються і будуть видалені в майбутньому великому випуску. Для отримання додаткової інформації зверніться до momentjs.com/guides/#/warnings/js-date .
Переключення

13

Я створив цей прототип для 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);

2
Ви можете використовувати d.setDate(d.getDate() + days)як позитивні, так і негативні значення для днів, щоб додавати і віднімати дні відповідно. І він повинен працювати над екземпляром (як це роблять інші методи Date), а не створювати та повертати копію.
RobG

13

Кілька існуючих рішень були близькими, але не зовсім те, що я хотів. Ця функція працює як з позитивними, так і з негативними значеннями та обробляє крайові випадки.

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

2
чи "перепливе" вона на наступний місяць, якщо я використовую цей метод, щоб додати 20 днів до 15 числа поточного місяця? Це не здається.
Бора

2
@Bora - так, вона правильно збільшує місяць, якщо це необхідно. Наприклад, додавши 20 днів до 15 серпня: addDays (нова дата (2015, 07, 15), 20) повернеться "Пт вересня 2015 00:00:00 GMT-0700 (PDT)"
Джоел Філлмор

12

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

3
Це не точно. Деякі день у році мають 23 години, а деякі 25 через правила часового поясу.
socketpair

Я б хвилювався за умови відмови, коли є високосні секунди ... тому, можливо, це не добре для критичного коду.
robocat

12

Я вважаю, що проблема з методом 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 днів.

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


11

розділіть дату на частини, а потім поверніть нову дату із скоригованими значеннями

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;


2
Що станеться, якщо ви додасте, наприклад, 50 днів до побачення таким чином? Чи встановить дату 68 серпня 2009 року? Або ви впевнені, що це завжди підходить до відповідного місяця та / або року правильно?
Джеспер

Використовується для додавання addDays, addMonths та addYears до Date.prototype. Приємно і просто.
Скотт Ісаак

1
Це має бути правильна відповідь - це працює навіть в останній день року, коли прийнята відповідь не відповідає.
kris

Не працює на дати з роками від 1 до 99. ;-) Набагато краще просто скористатися методами get * і set * .
RobG

8

Не використовуючи другу змінну, ви можете замінити 7 на спину x днів:

let d=new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))

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


2

Я створив функцію для маніпулювання датою. ви можете додавати або віднімати будь-яку кількість днів, годин, хвилин.

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

2

Використовуйте 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>


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


0

Мені подобається наступне, тому що це один рядок. Не ідеально підходить до змін DST, але, як правило, досить добре для моїх потреб.

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

0

для мене всі комбінації добре працювали з фрагментом коду нижче, фрагмент призначений для реалізації 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)
);
}

0

Я отримую хороший пробіг від date.js:

http://www.datejs.com/

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

Приємно!

Веб-сайт включає цю красу:

Datejs не просто розбирає рядки, він чітко розрізає їх надвоє


0

Якщо ви хочете відняти кількість днів і відформатувати свою дату у читаному для людини форматі, вам слід розглянути можливість створення спеціального 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));

(див. також цей Fiddle )


0

Дивіться наступний код, віднімайте дні від поточної дати. Також встановіть місяць відповідно до віднесеної дати.

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

-1

Під час встановлення дати дата перетворюється на мілісекунди, тому її потрібно перетворити на дату:

Цей метод також враховує, зміну нового року тощо.

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

-1

Ви можете за допомогою 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;

Сподіваюся, це допоможе вам.


-1

Я перетворив на мілісекунди і відрахували дні, ще місяць і рік не зміниться і логічно

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

Надія допомагає


-1

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


1
Ви завжди повинні коментувати свій код / ​​відповідь, оскільки деякі люди можуть не отримати того, що ви робите
Майкл

-1

Використання синтаксису сучасної функції JavaScript

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

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


-1

Спробуйте щось подібне

dateLimit = (curDate, limit) => {
    offset  = curDate.getDate() + limit
    return new Date( curDate.setDate( offset) )
}

currDate може бути будь-якої дати

обмеженням може бути різниця в кількості днів (позитивна на майбутнє та негативна на минуле)


-1

Це дасть вам результат за останні 10 днів, 110% працюючи, ви не отримаєте жодних питань

var date = new Date();
var day=date.getDate();
var month=date.getMonth() + 1;
var year=date.getFullYear();
var startDate=day+"/"+month+"/"+year;
var dayBeforeNineDays=moment().subtract(10, 'days').format('DD/MM/YYYY');
startDate=dayBeforeNineDays;
var endDate=day+"/"+month+"/"+year;

Ви можете змінити дні віднімання відповідно до Ваших вимог



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.