Додавання годин до об’єкта дати JavaScript?


399

Мене дивує, що об’єкт Date JavaScript не реалізує функції додавання будь-якого типу.

Я просто хочу функцію, яка може це робити:

var now = Date.now();
var fourHoursLater = now.addHours(4);

function Date.prototype.addHours(h) {

   // how do I implement this?  

}

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

  • Чи потрібно робити розбір рядків?

  • Чи можу я використовувати setTime?

  • Як щодо мілісекунд?

Подобається це:

new Date(milliseconds + 4*3600*1000 /*4 hrs in ms*/)?  

Це здається справді хакітським - і чи це навіть працює?

Відповіді:


422

Сам JavaScript має жахливі API дати / часу. Тим не менш, ви можете зробити це в чистому JavaScript:

Date.prototype.addHours = function(h) {
  this.setTime(this.getTime() + (h*60*60*1000));
  return this;
}

Працює як шарм! Дякую
moreirapontocom

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

@cdoern Я думаю, що це буде, оскільки getTime () повернеться мілісекундами, а ви просто додасте до цього більше мілісекунд
The1993

370
Date.prototype.addHours= function(h){
    this.setHours(this.getHours()+h);
    return this;
}

Тест:

alert(new Date().addHours(4));

25
Я не думаю, що це працює --- тестуйте його на чомусь 23 години, наприклад? Відповідь Джейсона Харвіга - це те, що мені прийшло в голову.
Доменіч

11
Неправильно додавати речі до прототипу об'єкта в Javascript, і Domenic є правильним, це не працює. Розв’язання Джейсона Гарвіга нижче нижче.
iKode

19
@Domenic Це прекрасно працює з 23:00, протестований у консолі JavaScript Firefox 10, Chrome 21 та IE 8/9 Тут використовується код, який я використовував для тестування: var date = new Date(2012, 10, 22, 23, 0, 1); date.toString(); // Thu Nov 22 2012 23:00:01 GMT+0100 (CET) date.setHours(date.getHours() + 1); date.toString(); // Fri Nov 23 2012 00:00:01 GMT+0100 (CET) Він також добре працює з setMinutes ()
tanguy_k

4
Виникли проблеми з цим рішенням - збільшення пункту на 1 для мене не вдалося в точці переходу на DST (рухатись годинником вперед на годину).
andrewb

2
Також мене покусало - я перебирав години, використовуючи setHours (getHours-1): зараз, на першій годині DST, це закінчується нескінченним циклом. Отже, перевірте результат!
cfstras

165

Нижче наведений код - додати 4 години до дати (наприклад, сьогоднішня дата)

var today = new Date();
today.setHours(today.getHours() + 4);

Якщо ви спробуєте додати 4 до 23 (див. Документи ), це не спричинить помилки :

Якщо параметр, який ви вказуєте, не відповідає очікуваному діапазону, setHours () намагається відповідно оновити інформацію про дату в об'єкті Date


Я цього не бачив і зробив повторну відповідь. Мені подобається цей метод. Точне і корисне.
Гендальф Білий

Схоже, це не працює, коли години є десятковим (не цілим числом)
gregmagdits

3
Тут найкраща відповідь ... додавання "addHours" до прототипу Date викликає занепокоєння, оскільки в якийсь момент JS може додати підтримку цієї функції, і тоді у вас є конфліктний прототип. Це дає вам функціональність, використовуючи приблизно стільки ж коду.
Кріс Бойд

здивовано, але насправді збільшуються дні, місяці, якщо це потрібно, посилання на документи буде корисним
2oppin

4
Хоча використання годинних значень> 23 це не порушує, воно, тим не менш, порушено при літній економії літнього часу . Враховуючи те, що він зламаний, немає жодної причини використовувати його; віддайте перевагу setTimeабо setUTCHour.
Марк Амері

40

Ймовірно, краще зробити метод addHours незмінним, повернувши копію об'єкта Date, а не змінивши його параметр.

Date.prototype.addHours= function(h){
    var copiedDate = new Date(this.getTime());
    copiedDate.setHours(copiedDate.getHours()+h);
    return copiedDate;
}

Таким чином, ви можете зв’язати купу викликів методів, не турбуючись про стан.


Ця функція має ті самі проблеми, що і тут, як зазначено stackoverflow.com/questions/1050720/… Справа не в тому, чи працює вона в певних браузерах, але інші місця, які використовують Javascript, сприймають це як проблему. поєднання вашого рішення з цим одним stackoverflow.com/a/1050782/295535 виявляється найкращим рішенням
Ressu

1
Вам слід розглянути можливість зміни назви функції, оскільки слово add*зазвичай використовується для мутації самого об'єкта.
mr5

@ mr5 - не впевнений у цьому, addбагато використовується в рамках .NET Framework DateTimeклас і має те саме значення, що і +(плюс) в Math.
Тахір Хассан

1
currentDate.addHours(1)<- Від свого інстинкту програмування я очікую, що currentDateзначення зміниться, але у вашій реалізації це не відбудеться. Щодо того, чому я пропоную перейменувати чи змінити його підпис на щось
mr5

1
@TahirHassan не має нічого спільного з технічними деталями, але з вибором правильного слова, яке буде використано для назви функції. Я все ще віддаю перевагу мутаційній версії, коли функція префіксованаadd
mr5,

23

Версія, запропонована kennebec, вийде з ладу при переході на DST або з нього, оскільки встановлюється номер години.

this.setUTCHours(this.getUTCHours()+h);

додасть hгодини thisнезалежним від особливостей системи часу. Також працює метод Джейсона Харвіга.



7

Я також думаю, що оригінальний об'єкт не повинен бути змінений. Тож, щоб заощадити майбутні робочі сили, ось комбіноване рішення на основі Джейсона Харвіга та Тахіра Хасана відповідає:

Date.prototype.addHours= function(h){
    var copiedDate = new Date();
    copiedDate.setTime(this.getTime() + (h*60*60*1000)); 
    return copiedDate;
}


4

Перевірте, чи не визначено його, інакше визначає його в прототипі Дата:

if (!Date.prototype.addHours) {
    Date.prototype.addHours = function(h) {
        this.setHours(this.getHours() + h);
        return this;
    };
}

3

Інший спосіб вирішити це - перетворити дату в unixtime (епоху), потім додати еквівалент за (мілі) секунд, а потім перетворити його назад. Таким чином можна обробляти переходи дня та місяця, як-от додавання 4 годин до 21, що має спричинити наступний день, 01:00.


Ти маєш рацію - але ти теж запізнився на пару років. Відповідь Джейсона Харвіга показала цей метод за 2 роки до вас; ця відповідь не додає нічого нового.
Марк Амері

3

Для простого додавання / віднімання години / хвилини в JavaScript, спробуйте це:

function getTime (addHour, addMin){
    addHour = (addHour?addHour:0);
    addMin = (addMin?addMin:0);
    var time = new Date(new Date().getTime());
    var AM = true;
    var ndble = 0;
    var hours, newHour, overHour, newMin, overMin;
    //change form 24 to 12 hour clock
    if(time.getHours() >= 13){
        hours = time.getHours() - 12;
        AM = (hours>=12?true:false);
    }else{
        hours = time.getHours();
        AM = (hours>=12?false:true);
    }
    //get the current minutes
    var minutes = time.getMinutes();
    // set minute
    if((minutes+addMin) >= 60 || (minutes+addMin)<0){
        overMin = (minutes+addMin)%60;
        overHour = Math.floor((minutes+addMin-Math.abs(overMin))/60);
        if(overMin<0){
            overMin = overMin+60;
            overHour = overHour-Math.floor(overMin/60);
        }
        newMin = String((overMin<10?'0':'')+overMin);
        addHour = addHour+overHour;
    }else{
        newMin = minutes+addMin;
        newMin = String((newMin<10?'0':'')+newMin);
    }
    //set hour
    if(( hours+addHour>=13 )||( hours+addHour<=0 )){
        overHour = (hours+addHour)%12;
        ndble = Math.floor(Math.abs((hours+addHour)/12));
        if(overHour<=0){
            newHour = overHour+12;
            if(overHour == 0){
                ndble++;
            }
        }else{
            if(overHour ==0 ){
                newHour = 12;
                ndble++;
            }else{
                ndble++;
                newHour = overHour;
            }
        }
        newHour = (newHour<10?'0':'')+String(newHour);
        AM = ((ndble+1)%2===0)?AM:!AM;
    }else{
        AM = (hours+addHour==12?!AM:AM);
        newHour = String((Number(hours)+addHour<10?'0':'')+(hours+addHour));
    }
    var am = (AM)?'AM':'PM';
    return new Array(newHour, newMin, am);
};

Це можна використовувати без параметрів, щоб отримати поточний час

getTime();

або з параметрами, щоб отримати час із доданими хвилинами / годинами

getTime(1,30); // adds 1.5 hours to current time
getTime(2);    // adds 2 hours to current time
getTime(0,120); // same as above

навіть негативний час працює

getTime(-1, -30); // subtracts 1.5 hours from current time

ця функція повертає масив

array([Hour], [Minute], [Meridian])

Яку перевагу має цей 56-рядовий монстр функції над дворядковим підходом у відповіді, що голосує в топі ? -1 тому, що тут є величезна додаткова складність, яку я не бачу.
Марк Амері

1

SPRBRN правильний. Для того, щоб врахувати початок / кінець місяця і року, вам потрібно перейти в Епоху і назад.

Ось як це зробити:

var milliseconds = 0;          //amount of time from current date/time
var sec = 0;                   //(+): future
var min = 0;                   //(-): past
var hours = 2;
var days = 0;

var startDate = new Date();     //start date in local time (we'll use current time as an example)

var time = startDate.getTime(); //convert to milliseconds since epoch

//add time difference
var newTime = time + milliseconds + (1000*sec) + (1000*60*min) + (1000*60*60*hrs) + (1000*60*60*24)

var newDate = new Date(newTime);//convert back to date; in this example: 2 hours from right now


або зробити це в одному рядку (де імена змінних такі ж, як вище:

var newDate = 
    new Date(startDate.getTime() + millisecond + 
        1000 * (sec + 60 * (min + 60 * (hours + 24 * days))));

0

Це простий спосіб отримати збільшення або зменшення значення даних.

const date = new Date()
const inc = 1000 * 60 * 60 // an hour
const dec = (1000 * 60 * 60) * -1 // an hour

const _date = new Date(date)
return new Date( _date.getTime() + inc )
return new Date( _date.getTime() + dec )

-1

Трохи безладно, але це працює!

З огляду на такий формат дати: 2019-04-03T15: 58

  //Get the start date.
  var start = $("#start_date").val();
  //Split the date and time.
  var startarray = start.split("T");
  var date = startarray[0];
  var time = startarray[1];

  //Split the hours and minutes.
  var timearray = time.split(":");

  var hour = timearray[0];
  var minute = timearray[1];
  //Add an hour to the hour.
  hour++;
  //$("#end_date").val = start;
  $("#end_date").val(""+date+"T"+hour+":"+minute+"");

Ваш результат буде: 2019-04-03T16: 58

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