Ответы:
Вы можете создать один с: -
Date.prototype.addDays = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
var date = new Date();
alert(date.addDays(5));
Это обеспечивает автоматическое увеличение месяца при необходимости. Например:
31.08 + 1 день станет 9/1 .
Проблема с использованием setDate
напрямую заключается в том, что это мутатор, и такого рода вещи лучше избегать. ECMA счел целесообразным рассматривать Date
как изменчивый класс, а не неизменную структуру.
864E5
по какой-то причине я предпочитаю писать 24*60*60
в своем коде :)
Правильный ответ :
function addDays(date, days) {
var result = new Date(date);
result.setDate(result.getDate() + days);
return result;
}
Неверный ответ :
Этот ответ иногда дает правильный результат, но очень часто возвращает неправильный год и месяц. Единственный раз, когда этот ответ работает, когда дата, к которой вы добавляете дни, совпадает с текущим годом и месяцем.
// Don't do it this way!
function addDaysWRONG(date, days) {
var result = new Date();
result.setDate(date.getDate() + days);
return result;
}
Доказательство / Пример
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);
Будьте осторожны, потому что это может быть сложно. При установке «завтра», это работает только потому, что его текущее значение соответствует году и месяцу для «сегодня». Однако установка числа даты, такого как «32», обычно все равно будет работать, чтобы перенести его на следующий месяц.
var d = new Date(); d.setDate( d.getDate() + 1 );
?
getDate()
возвращает день этого года . Затем вызов setDate
устанавливает день в текущем году . Так что это НЕ хорошее общее решение. Ответ @ AnthonyWJones на самом деле работает правильно.
var d = new Date(2015,11,30);d.setDate(d.getDate() + 370)
дает 3 января 2017 года, который пересекает 2 года.
Мое простое решение:
nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+1);
Это решение не имеет проблемы с переходом на летнее время. Кроме того, можно добавить / суб любое смещение для лет, месяцев, дней и т. Д.
day=new Date(oldDate.getFullYear()-2,oldDate.getMonth()+22,oldDate.getDate()+61);
правильный код
setDate
.
Эти ответы кажутся мне запутанными, я предпочитаю:
var ms = new Date().getTime() + 86400000;
var tomorrow = new Date(ms);
getTime () дает нам миллисекунды с 1970 года, а 86400000 - это количество миллисекунд в день. Следовательно, ms содержит миллисекунды для желаемой даты.
Использование миллисекундного конструктора дает желаемый объект даты.
new Date(new Date('11/4/2012').getTime() + 86400000)
Пытаться
var someDate = new Date();
var duration = 2; //In Days
someDate.setTime(someDate.getTime() + (duration * 24 * 60 * 60 * 1000));
Использование setDate () для добавления даты не решит вашу проблему, попробуйте добавить несколько дней в февраль месяц, если вы попытаетесь добавить к нему новые дни, это не приведет к тому, что вы ожидали.
setDate()
? Это так: stackoverflow.com/questions/5497637/…
Просто потратил целую вечность, пытаясь понять, что за сделка с годом не складывалась, если следовать приведенным ниже примерам.
Если вы хотите просто добавить n дней к вашей дате, лучше всего пойти:
myDate.setDate (myDate.getDate () + n);
или длинная версия
var theDate = new Date(2013, 11, 15);
var myNewDate = new Date(theDate);
myNewDate.setDate(myNewDate.getDate() + 30);
console.log(myNewDate);
Это сегодня / завтра вещи сбивают с толку. Установив текущую дату в новую переменную даты, вы запутаете значение года. если вы работаете с первоначальной даты, вы не будете.
Если можете, используйте moment.js . JavaScript не имеет очень хороших собственных методов даты / времени. Ниже приведен пример синтаксиса Moment:
var nextWeek = moment().add(7, 'days');
alert(nextWeek);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>
int days = 1;
var newDate = new Date(Date.now() + days * 24*60*60*1000);
var days = 2;
var newDate = new Date(Date.now() + days * 24*60*60*1000);
document.write('Today: <em>');
document.write(new Date());
document.write('</em><br/> New: <strong>');
document.write(newDate);
Я создал эти расширения вчера вечером:
вы можете передавать как положительные, так и отрицательные значения;
пример:
var someDate = new Date();
var expirationDate = someDate.addDays(10);
var previous = someDate.addDays(-5);
Date.prototype.addDays = function (num) {
var value = this.valueOf();
value += 86400000 * num;
return new Date(value);
}
Date.prototype.addSeconds = function (num) {
var value = this.valueOf();
value += 1000 * num;
return new Date(value);
}
Date.prototype.addMinutes = function (num) {
var value = this.valueOf();
value += 60000 * num;
return new Date(value);
}
Date.prototype.addHours = function (num) {
var value = this.valueOf();
value += 3600000 * num;
return new Date(value);
}
Date.prototype.addMonths = function (num) {
var value = new Date(this.valueOf());
var mo = this.getMonth();
var yr = this.getYear();
mo = (mo + num) % 12;
if (0 > mo) {
yr += (this.getMonth() + num - mo - 12) / 12;
mo += 12;
}
else
yr += ((this.getMonth() + num - mo) / 12);
value.setMonth(mo);
value.setYear(yr);
return value;
}
Не используя вторую переменную, вы можете заменить 7 на следующие x дней:
let d=new Date(new Date().getTime() + (7 * 24 * 60 * 60 * 1000));
вычесть 30 дней использования (24 часа = 86400000 мс)
new Date(+yourDate - 30 *86400000)
Самое простое решение.
Date.prototype.addDays = function(days) {
this.setDate(this.getDate() + parseInt(days));
return this;
};
// and then call
var newDate = new Date().addDays(2); //+2 days
console.log(newDate);
// or
var newDate1 = new Date().addDays(-2); //-2 days
console.log(newDate1);
Решение, разработанное для оператора трубопровода :
const addDays = days => date => {
const result = new Date(date);
result.setDate(result.getDate() + days);
return result;
};
Применение:
// Without the pipeline operator...
addDays(7)(new Date());
// And with the pipeline operator...
new Date() |> addDays(7);
Если вам нужно больше функциональности, я предлагаю заглянуть в библиотеку date-fns .
Спасибо Джейсону за ваш ответ, который работает, как и ожидалось, вот сочетание вашего кода и удобного формата AnthonyWJones:
Date.prototype.addDays = function(days){
var ms = new Date().getTime() + (86400000 * days);
var added = new Date(ms);
return added;
}
Поздно на вечеринке, но если вы используете, есть отличный плагин под названием Момент:jQuery
то
var myDateOfNowPlusThreeDays = moment().add(3, "days").toDate();
http://momentjs.com/docs/#/manipulating/
И много других хороших вещей там!
Редактировать: ссылка на jQuery удалена благодаря комментарию aikeru
Старый я знаю, но иногда мне нравится это:
function addDays(days) {
return new Date(Date.now() + 864e5 * days);
}
Date.prototype.addDays = function(days) {return new Date(this.getTime() + (864e5 * days));};
У меня были проблемы с переходом на летнее время с предложенным решением.
Используя getUTCDate
/ setUTCDate
вместо этого, я решил свою проблему.
// Curried, so that I can create helper functions like `add1Day`
const addDays = num => date => {
// Make a working copy so we don't mutate the supplied date.
const d = new Date(date);
d.setUTCDate(d.getUTCDate() + num);
return d;
}
Вы можете использовать JavaScript, JQuery не требуется:
var someDate = new Date();
var numberOfDaysToAdd = 6;
someDate.setDate(someDate.getDate() + numberOfDaysToAdd);
Formatting to dd/mm/yyyy :
var dd = someDate.getDate();
var mm = someDate.getMonth() + 1;
var y = someDate.getFullYear();
var someFormattedDate = dd + '/'+ mm + '/'+ y;
Общий прототип без переменных, он применяется к существующему значению Date:
Date.prototype.addDays = function (days) {
return new Date(this.valueOf() + days * 864e5);
}
Документы mozilla для setDate () не указывают, что он будет обрабатывать сценарии на конец месяца. См. Https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date.
SETDATE ()
Вот почему я использую setTime (), когда мне нужно добавить дни.
Так просто, как это:
new Date((new Date()).getTime() + (60*60*24*1000));
Полагаю, я также дам ответ:
лично я хотел бы попытаться избежать необоснованного объявления переменных, вызовов методов и вызовов конструктора, поскольку все они дороги в производительности. (в пределах разумного, конечно)
Я собирался оставить это как просто комментарий под Ответом, данным @AnthonyWJones, но думал об этом лучше.
// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
return this.setTime( 864E5 * days + this.valueOf() ) && this;
};
// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
return date.setTime( 864E5 * days + date.valueOf() ) && date;
};
// Basic Function declaration...
function addDaysToDate( date, days ) {
return date.setTime( 864E5 * days + date.valueOf() ) && date;
};
Выше будет уважать DST. Это означает, что если вы добавите количество дней, пересекающих DST, отображаемое время (часы) изменится, чтобы отразить это.
Пример:
2 ноября 2014 г. 02:00 был конец летнего времени.
var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt ); // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) ); // Tue Nov 11 2014 09:30:00
Если вы хотите сохранить время по летнему времени (10:30 все равно будет 10:30) ...
// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
return this.setDate( this.getDate() + days ) && this;
};
// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
return date.setDate( date.getDate() + days ) && date;
};
// Basic Function declaration...
function addDaysToDate( date, days ) {
return date.setDate( date.getDate() + days ) && date;
};
Итак, теперь у вас есть ...
var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt ); // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) ); // Tue Nov 11 2014 10:30:00
Нет, в javascript нет встроенной функции, но вы можете использовать простую строку кода
timeObject.setDate(timeObject.getDate() + countOfDays);
Я использую что-то вроде:
new Date(dateObject.getTime() + amountOfDays * 24 * 60 * 60 * 1000)
Работает с экономией времени:
new Date(new Date(2014, 2, 29, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)
Работает с новым годом:
new Date(new Date(2014, 11, 31, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)
Это может быть параметризовано:
function DateAdd(source, amount, step) {
var factor = 1;
if (step == "day") factor = 24 * 60 * 60 * 1000;
else if (step == "hour") factor = 60 * 60 * 1000;
...
new Date(source.getTime() + amount * factor);
}
Я использую следующее решение.
var msInDay = 86400000;
var daysToAdd = 5;
var now = new Date();
var milliseconds = now.getTime();
var newMillisecods = milliseconds + msInDay * daysToAdd;
var newDate = new Date(newMillisecods);
//or now.setTime(newMillisecods);
Date имеет конструктор, который принимает int. Этот аргумент представляет общее количество миллисекунд до / после 1 января 1970 года. Он также имеет метод setTime, который делает то же самое, не создавая новый объект Date.
Здесь мы конвертируем дни в миллисекунды и добавляем это значение к значению, предоставленному getTime. Наконец, мы передаем результат конструктору Date (миллисекунды) или методу setTime (миллисекунды).
now.setDate(now.getDate() + days);
автоматически обрабатывает изменения летнего времени. И я должен исправить, високосные секунды игнорируются в метках времени JS.
Изменить:
Вместо setTime()
(или setHours()
) вы можете сделать это следующим образом:
Date.prototype.addDays= function(d){
this.setDate(this.getDate() + d);
return this;
};
var tomorrow = new Date().addDays(1);
Старый:
Вместо использования setTime()
вы можете использовать setHours()
:
Date.prototype.addDays= function(d){
this.setHours(this.getHours() + d * 24);
return this;
};
var tomorrow = new Date().addDays(1);
Смотрите JSFiddle ...
d.setDate(d.getDate() + 1);
Очень простой код для добавления дней в дате в сценарии Java.
var d = new Date();
d.setDate(d.getDate() + prompt('how many days you want to add write here'));
alert(d);
Есть setDate и метод getDate , которые позволяют вам делать что-то вроде этого:
var newDate = aDate.setDate(aDate.getDate() + numberOfDays);
Если вы хотите вычесть количество дней и отформатировать дату в удобочитаемом формате, вам следует рассмотреть возможность создания пользовательского 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. Add 20 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), 20));
(см. также эту скрипку )
Расширение прототипа в JavaScript не может быть хорошей идеей , особенно в профессиональных кодовых базах.
Что вы хотите сделать, это расширить родной Date
класс:
class MyCustomDate extends Date {
addDays(days) {
const date = new MyCustomDate(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
}
const today = new MyCustomDate();
const nextWeek = today.addDays(7)
console.log(nextWeek)
Таким образом, если однажды Javascript реализует нативный addDays
метод, вы ничего не сломаете.
Date.prototype.addDays=function(d){return new Date(this.valueOf()+864E5*d);};