Я хотел бы получить объект Date, который на 30 минут позже другого объекта Date. Как это сделать с помощью JavaScript?
Как добавить 30-минутный объект JavaScript Date?
Ответ 1
Использование библиотеки
Если вы выполняете много работы с датами, вы можете посмотреть библиотеки дат JavaScript, такие как Datejs или Moment.js. Например, для Moment.js это просто:
var newDateObj = moment(oldDateObj).add(30, 'm').toDate();
Ванильный Javascript
Это похоже на хаос ответа, но в одну строку:
var newDateObj = new Date(oldDateObj.getTime() + diff*60000);
Где diff
- это разница в минутах, которую вы хотите от времени oldDateObj
. Это может быть даже отрицательным.
Или как многократно используемую функцию, если вам нужно сделать это в нескольких местах:
function addMinutes(date, minutes) {
return new Date(date.getTime() + minutes*60000);
}
And just in case this is not obvious, the reason we multiply minutes by [TG45] is to convert minutes to milliseconds.
Будьте осторожны с ванильным Javascript. Даты трудны!
Вы можете подумать, что можете добавить 24 часа к дате, чтобы получить дату завтра, верно? Неправильно!
addMinutes(myDate, 60*24); //DO NOT DO THIS
Оказывается, если пользователь соблюдает переход на летнее время, день не обязательно должен длиться 24 часа. Один день в году длится всего 23 часа, а один день в году - 25 часов. Например, в большинстве Соединенных Штатов и Канады 24 ноября после полуночи, 2 ноября 2014 г., по-прежнему 2 ноября:
const NOV = 10; //because JS months are off by one...
addMinutes(new Date(2014, NOV, 2), 60*24); //In USA, prints 11pm on Nov 2, not 12am Nov 3!
Именно поэтому использование одной из вышеупомянутых библиотек является более безопасным вариантом, если вам приходится много работать с этим.
Ниже приведена более общая версия этой функции, которую я написал. Я бы по-прежнему рекомендовал использовать библиотеку, но это может быть излишним/невозможным для вашего проекта. Синтаксис смоделирован после функции MySQL DATE_ADD.
/**
* Adds time to a date. Modelled after MySQL DATE_ADD function.
* Example: dateAdd(new Date(), 'minute', 30) //returns 30 minutes from now.
* https://stackoverflow.com/a/1214753/18511
*
* @param date Date to start with
* @param interval One of: year, quarter, month, week, day, hour, minute, second
* @param units Number of units of the given interval to add.
*/
function dateAdd(date, interval, units) {
if(!(date instanceof Date))
return undefined;
var ret = new Date(date); //don't change original date
var checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);};
switch(String(interval).toLowerCase()) {
case 'year' : ret.setFullYear(ret.getFullYear() + units); checkRollover(); break;
case 'quarter': ret.setMonth(ret.getMonth() + 3*units); checkRollover(); break;
case 'month' : ret.setMonth(ret.getMonth() + units); checkRollover(); break;
case 'week' : ret.setDate(ret.getDate() + 7*units); break;
case 'day' : ret.setDate(ret.getDate() + units); break;
case 'hour' : ret.setTime(ret.getTime() + units*3600000); break;
case 'minute' : ret.setTime(ret.getTime() + units*60000); break;
case 'second' : ret.setTime(ret.getTime() + units*1000); break;
default : ret = undefined; break;
}
return ret;
}
Ответ 2
var d1 = new Date (),
d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
Ответ 3
var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
console.log(newDateObj);
Ответ 4
var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);
Ответ 5
Может как то так?
var d = new Date();
var v = new Date();
v.setMinutes(d.getMinutes()+30);
console.log(v)
Ответ 6
Я всегда создаю 7 функций, чтобы работать с датой в JS: addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears.
Здесь вы можете увидеть пример: http://jsfiddle.net/tiagoajacobi/YHA8x/
Как использовать:
var now = new Date();
console.log(now.addMinutes(30));
console.log(now.addWeeks(3));
Это следующие функции:
Date.prototype.addSeconds = function(seconds) {
this.setSeconds(this.getSeconds() + seconds);
return this;
};
Date.prototype.addMinutes = function(minutes) {
this.setMinutes(this.getMinutes() + minutes);
return this;
};
Date.prototype.addHours = function(hours) {
this.setHours(this.getHours() + hours);
return this;
};
Date.prototype.addDays = function(days) {
this.setDate(this.getDate() + days);
return this;
};
Date.prototype.addWeeks = function(weeks) {
this.addDays(weeks*7);
return this;
};
Date.prototype.addMonths = function (months) {
var dt = this.getDate();
this.setMonth(this.getMonth() + months);
var currDt = this.getDate();
if (dt !== currDt) {
this.addDays(-currDt);
}
return this;
};
Date.prototype.addYears = function(years) {
var dt = this.getDate();
this.setFullYear(this.getFullYear() + years);
var currDt = this.getDate();
if (dt !== currDt) {
this.addDays(-currDt);
}
return this;
};
Ответ 7
Самый простой способ решить - признать, что в датах javascript есть только цифры. Он начинается с 0
или 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST)
. Каждый 1
представляет собой миллисекунду. Вы можете добавить или вычесть миллисекунды, получив значение и создав новую дату с использованием этого значения. Вы можете справиться с этим довольно легко с этим умом.
const minutesToAdjust = 10;
const millisecondsPerMinute = 60000;
const originalDate = new Date('11/20/2017 10:00 AM');
const modifiedDate1 = new Date(originalDate.valueOf() - (minutesToAdjust * millisecondsPerMinute));
const modifiedDate2 = new Date(originalDate.valueOf() + (minutesToAdjust * millisecondsPerMinute));
console.log(originalDate); // Mon Nov 20 2017 10:00:00 GMT-0600 (CST)
console.log(modifiedDate1); // Mon Nov 20 2017 09:50:00 GMT-0600 (CST)
console.log(modifiedDate2); // Mon Nov 20 2017 10:10:00 GMT-0600 (CST)
Ответ 8
Это то, что я делаю, что, кажется, работает достаточно хорошо:
Date.prototype.addMinutes = function(minutes) {
var copiedDate = new Date(this.getTime());
return new Date(copiedDate.getTime() + minutes * 60000);
}
Тогда вы можете просто называть это следующим образом:
var now = new Date();
console.log(now.addMinutes(50));
Ответ 9
Вот версия ES6:
let getTimeAfter30Mins = () => {
let timeAfter30Mins = new Date();
timeAfter30Mins = new Date(timeAfter30Mins.setMinutes(timeAfter30Mins.getMinutes() + 30));
};
Назовите его так:
getTimeAfter30Mins();
Ответ 10
Я чувствую, что во многих ответах здесь отсутствует креативная составляющая, очень необходимая для расчетов путешествий во времени. Я представляю свое решение для временного перевода 30 минут.
(jsfiddle здесь)
function fluxCapacitor(n) {
var delta,sigma=0,beta="ge";
(function(K,z){
(function(a,b,c){
beta=beta+"tT";
switch(b.shift()) {
case'3':return z('0',a,c,b.shift(),1);
case'0':return z('3',a,c,b.pop());
case'5':return z('2',a,c,b[0],1);
case'1':return z('4',a,c,b.shift());
case'2':return z('5',a,c,b.pop());
case'4':return z('1',a,c,b.pop(),1);
}
})(K.pop(),K.pop().split(''),K.pop());
})(n.toString().split(':'),function(b,a,c,b1,gamma){
delta=[c,b+b1,a];sigma+=gamma?3600000:0;
beta=beta+"im";
});
beta=beta+"e";
return new Date (sigma+(new Date( delta.join(':')))[beta]());
}
Ответ 11
Для ленивого, как я:
Ответ на Kip (сверху) в coffeescript, используя "перечисление" и работающий на одном и том же объекте:
Date.UNIT =
YEAR: 0
QUARTER: 1
MONTH: 2
WEEK: 3
DAY: 4
HOUR: 5
MINUTE: 6
SECOND: 7
Date::add = (unit, quantity) ->
switch unit
when Date.UNIT.YEAR then @setFullYear(@getFullYear() + quantity)
when Date.UNIT.QUARTER then @setMonth(@getMonth() + (3 * quantity))
when Date.UNIT.MONTH then @setMonth(@getMonth() + quantity)
when Date.UNIT.WEEK then @setDate(@getDate() + (7 * quantity))
when Date.UNIT.DAY then @setDate(@getDate() + quantity)
when Date.UNIT.HOUR then @setTime(@getTime() + (3600000 * quantity))
when Date.UNIT.MINUTE then @setTime(@getTime() + (60000 * quantity))
when Date.UNIT.SECOND then @setTime(@getTime() + (1000 * quantity))
else throw new Error "Unrecognized unit provided"
@ # for chaining
Ответ 12
Используйте существующую библиотеку, известную для обработки причуд, связанных с расчетом времени. Мой текущий любимый moment.js.
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.js"></script>
<script>
var now = moment(); // get "now"
console.log(now.toDate()); // show original date
var thirty = moment(now).add(30,"minutes"); // clone "now" object and add 30 minutes, taking into account weirdness like crossing DST boundries or leap-days, -minutes, -seconds.
console.log(thirty.toDate()); // show new date
</script>
Ответ 13
Еще один вариант, который я написал:
Это слишком сложно, если это вся обработка даты, которая вам нужна, но она сделает то, что вы хотите.
Поддерживает форматирование даты и времени, математику даты (детали добавления/вычитания даты), сопоставление даты, синтаксический анализ и т.д. Это либерально раскрывается.