Як додати 30 хвилин до об’єкта дати JavaScript?


783

Я хотів би отримати об’єкт Date, який на 30 хвилин пізніше іншого об'єкта Date. Як це зробити за допомогою JavaScript?


1
Я побудував невеликий спливаючий скрипт календаря у js, його на Github , можливо, перегляньте код, щоб побачити, як взаємодіє об’єкт дати. Також перевірте Javascript Kit як його дивовижну посилання на js, особливо для об’єкта дати.
Крістіан

2
Усі наведені нижче відповіді, які використовують варіант зміни date.setMinutes(date.getMinutes() + ...), не зможуть перетинати межі літнього режиму . Наприклад (якщо припустити, що "2014-03-09" є межею літнього режиму): var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30); dзараз на 30 хвилин раніше, а не пізніше ніж f.
Шпиль

1
@Spig: Через 30 хвилин після 1:59 на кордоні DST є 1:29 ранку. Помилки немає. Якщо друк fі dви побачите один каже : «GMT-0500» інший каже «GMT-0400» (або будь-який інший ваш часовий пояс). Крім того, якщо ви зателефонуєте і .getTime()на обидва, fі dви побачите, що fвони більше d(тобто пізніше).
Кіп

1
@Spig: цікаво, спробував це на Firefox і він спрацював. Я думаю, що він потрапляє в сіру зону в специфікації того, як getMinutes () повинен працювати. 01:89стане 02:29, чого не існує в день, коли ви "навесні вперед". Chrome вирішує, що так має бути 01:29, FF вирішує 03:29. У ніч, коли ви «падаєте назад», обидва браузери пропускають годину «падіння назад» і стрибають на 90 хвилин вперед 02:29. Ось кілька демонстрацій JSFiddle: "весна вперед" / "падіння назад"
Кіп

1
Якщо одна з наведених нижче відповідей відповіла на ваше запитання, як працює цей сайт, ви б "прийняли" відповідь, докладніше тут: Що робити, коли хтось відповість на моє запитання? . Але лише в тому випадку, якщо на ваше питання дійсно було відповідено. Якщо ні, то спробуйте додати більше деталей до питання.
Goodbye StackExchange

Відповіді:


950

Використання бібліотеки

Якщо ви займаєтесь великою кількістю дат, ви можете заглянути в такі бібліотеки дат 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);
}

І на випадок, якщо це не очевидно, причина, яку ми множимо на хвилини, 60000- це перетворити хвилини на мілісекунди.

Будьте обережні з ванільним 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;
}

Робоча jsFiddle демо .


14
Це дуже потужно; Він працює протягом будь-якої кількості хвилин, навіть якщо число було від’ємним.
Вахід Бітар

3
На секунди помножте на 1000 замість 60 к.
ashes999

2
Функція dateAdd () чудова! Але є одна примітка від мене - семантично, одиниця повинна бути "хвилина", "секунда" і т. Д., А інтервал повинен бути сумою (2, 10, 45, ...), а не навпаки. Інакше ідея хороша.
Василь Попов

1
Ця відповідь не відповідає вмісту місячного переліку, тому 31 січня плюс один місяць дає 2 або 3 березня, залежно від того, чи є високосний рік чи ні. Функції addMonths і addYears у відповіді Якобі вирішують це питання для мене, це краща відповідь.
RobG

1
@RobG Добре. Я додав виправлення до цього і ще більше підкреслив пункт "використовувати бібліотеку, якщо можливо".
Кіп

237
var d1 = new Date ();
var d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );

114
@Jamie: Вам не потрібно два Dateоб’єкти. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Грант Вагнер

15
@Grant: Я припускав, що d2 = "Я хотів би отримати об'єкт дати" і d1 = "до іншого об'єкта дати"
Джеймі

7
@CKeene, setMinutes & getMinutes є частиною звичайного старого Javascript (хоча datejs містить цілу купу інших речей).
s29

4
FYI - це може перетинати межі літнього часу. Демонстрація JSFiddle: "весна вперед" / "падіння назад" (спасибі @Spig за це)
Kip

@trevorgrayson Якщо вказаний параметр виходить за рамки очікуваного діапазону, setMinutes () намагається відповідно оновити інформацію про дату. Наприклад, якщо ви використовуєте 100, годин буде збільшено на 1, а 40 - для хвилин.
Mihai Crăiță

155

var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
console.log(newDateObj);


3
Зверніть увагу, що setTimeповертає числову мітку в секунду, а не об'єкт дати. (Не думайте, що ви можете зробити однолінійку.)
Алан Х.

12
var in30Mins = new Date(+new Date() + 1.8e6)є однолінійним, але не впевнений, що це краще, ніж двоконтурний. ;-)
RobG

112

var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);


9
Помітив, я опублікував копію цього. Натомість видалено та поставлено +1.
Іззи

3
найпростіша відповідь на це питання
vijay

Я думаю, setMinutesповертає часову nowDatenow = new Date(now)
позначку

46

Може щось подібне?

var d = new Date();
var v = new Date();
v.setMinutes(d.getMinutes()+30);

console.log(v)


6
@ Chacha102: Вам не потрібно два Dateоб’єкти. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Грант Вагнер

12
Він хотів двох об’єктів побачення. Прочитайте питання. Один об'єкт дати, який на 30 хвилин вищий від іншого об'єкта дати.
Тайлер Картер

5
Чи працює це нормально, якщо він циклічить минулу годину? Тож якщо я зателефоную на 11:59, чи це графік добре о 12:29?
Chris Rae

1
@ChrisRae так, це так. If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
fridoo

35

Я завжди створюю 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;
        };

Хтось може бачити якусь проблему з таким підходом?
Дембінський

1
використовуйте moment.js замість цього
Віктор Пудєєв

@ The Dembinski - які питання ви очікуєте? Розширення вбудованих програм зазвичай не подобається, але я не можу побачити проблеми з Date. Було б добре, якби кожен головний приріст також необов'язково встановив би його незначні кроки (як це роблять методи * ), тому addHours необов'язково зайняв хвилини, секунди та мілісекунди, щоб ви могли date.addHours(3, 30)додати 3 години 30 хвилин. addYears триватимуть роки, місяці та дні, addMonths займуть місяці та дні, addMinutes займе хвилини, секунди, мілісекунди тощо
RobG

1
Привіт @transformer Я б зробив щось подібне new Date().addHours(4).addMinutes(45);Ви можете телефонувати скільки завгодно, оскільки методи повертають "це", що є поточним об'єктом дати.
Якобі

1
Привіт @transformer, я не впевнений, що я зрозумів вашу проблему, але це прототип функції, яку ви можете використовувати в будь-якому бажаному порядку, наприклад: var dt = new Date();тоді dt.addMinutes(45); dt.addHours(4);або навіть, dt.addMinutes(285);або також dt.addMinutes(45).addHours(4);все буде працювати. Якщо у вас є запитання з прикладом коду, для вашої проблеми опублікуйте його тут, я з радістю допоможу вам.
Якобі

13

Найпростіший спосіб вирішити - це визнати, що дати в 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)

10

Це те, що я роблю, і, здається, працює досить добре:

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

2
Ви могли просто зробити return new Date(this.getTime() + minutes * 60000);, я тимчасовий скопійований дату не потрібен. ;-)
RobG

5

Ось версія ES6 :

let getTimeAfter30Mins = () => {
  let timeAfter30Mins = new Date();
  timeAfter30Mins = new Date(timeAfter30Mins.setMinutes(timeAfter30Mins.getMinutes() + 30));
};

Назвіть це так:

getTimeAfter30Mins();

У мене є користувачі, які вводять 4:30 год. + 2:15 год. / Хв., Як я можу дозволити користувачам проходити години та хвилини та додати їх до існуючих годин.
трансформер

@transformer Ви можете давати різні поля введення годинами, хвилинами і так далі з підтвердженням кількості.
xameeramir

5

Я думаю, що багато відповідей тут не мають творчої складової, дуже потрібної для обчислень подорожей у часі. Я представляю своє рішення тимчасового перекладу тривалістю 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]());
}

Я мушу визнати, що це творче. Але людина .. Це важко читати!
Ерік Баан

2

Для ледачих, як я:

Відповідь Кіпа (зверху) у coffeescript, використовуючи "enum", і працює на тому ж об'єкті:

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

2

Використовуйте наявну бібліотеку, відому для обробки вигадок, що стосуються обчислень часу. Мій поточний фаворит - 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>

3
Відповіді не можуть покращитись, якщо ви заявляєте, не пояснюючи причин.
Ouroborus

ОП попросило рішення JavaScript, а не рамки / бібліотеки.
mattpark22

2
@ mattpark22 Хоча я розумію, що ви отримуєте, бібліотека javascript все ще залишається JavaScript. Я міг зірвати лише відповідні фрагменти бібліотеки і представити їх як рішення коду. ОП мав би відповідь, що це JavaScript, у тому сенсі, що ви це маєте на увазі, але не знає про (можливо) прийнятне рішення загального призначення. Крім того, додавання 30 хвилин не є настільки тривіальним, як більшість відповідей звучить, оскільки існує безліч крайових справ, якими не обробляється об’єкт Date. Наприклад, найпопулярніші відповіді перериваються при перетині меж DST.
Ouroborus

@ Ouroborus - бібліотеки не повинні бути єдиним рішенням, якщо ОП не вимагає бібліотеки в ОП або тегів. В іншому випадку відповіді можуть стати лише літарією способів зробити щось у різних бібліотеках, і ОП не залишає розумніше їхнього актуального питання (що в даному випадку досить тривіально вирішити).
RobG

1
@RobG Ніхто не припускає, що надаватись лише бібліотечні рішення. ОП не може спеціально просити бібліотеку, оскільки це може спричинити питання поза темою. На запитання "Як це зробити за допомогою JavaScript?" можна трактувати як вказівку, що це специфічно для javascript (запит на рішення певною мовою, на відміну від запиту необробленого рішення коду), особливо враховуючи, що ця деталь повторюється в заголовку та тегах.
Ouroborus

1

Ще один варіант, про який я писав:

DP_DateExtensions Library

Це надмірно, якщо це вся обробка дат, яка вам потрібна, але вона буде робити те, що ви хочете.

Підтримує форматування дати / часу, математику дати (додавання / віднімання частин дати), порівняння дат, аналіз дати тощо.


1

Ви можете це зробити:

let thirtyMinutes = 30 * 60 * 1000; // convert 30 minutes to milliseconds
let date1 = new Date();
let date2 = new Date(date1.getTime() + thirtyMinutes);
console.log(date1);
console.log(date2);



1

Ви повинні отримати значення поточної дати, щоб отримати дату з (мс) та додати до неї (30 * 60 * 1000). Тепер у вас (поточна дата + 30 хв) з мс

console.log('with ms', Date.now() + (30 * 60 * 1000))
console.log('new Date', new Date(Date.now() + (30 * 60 * 1000)))


0

Я знаю, що тема занадто стара. Але я майже впевнений, що є деякі розробники, які все ще потребують цього, тому я зробив для вас цей простий сценарій. Сподіваюся, вам сподобається!

function strtotime(date, addTime){
  let generatedTime=date.getTime();
  if(addTime.seconds) generatedTime+=1000*addTime.seconds; //check for additional seconds 
  if(addTime.minutes) generatedTime+=1000*60*addTime.minutes;//check for additional minutes 
  if(addTime.hours) generatedTime+=1000*60*60*addTime.hours;//check for additional hours 
  return new Date(generatedTime);
}

let futureDate = strtotime(new Date(), {
    hours: 1, //Adding one hour
    minutes: 45, //Adding fourty five minutes
    seconds: 0 //Adding 0 seconds return to not adding any second so  we can remove it.
});
<button onclick="alert(futureDate)">Travel to the future</button>

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