Добавление часов в объект даты Javascript?


меня поражает, что объект даты 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*/)?  

этот кажется действительно хакерским, хотя - и это даже работает?

12 295

12 ответов:

JavaScript имеет страшную дату/время API,. Это единственный способ сделать это на чистом JavaScript. Я бы рекомендовал использовать Datejs - как предложил Носредна - если вы делаете много манипуляций даты, хотя.

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

ниже код, чтобы добавить 4 часа на сегодняшний день (пример сегодняшней даты)

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

это не вызовет ошибку, если вы попытаетесь добавить 4 к 23 (см. docs):

если указанный параметр находится за пределами ожидаемого диапазона, setHours () пытается соответствующим образом обновить информацию о дате в объекте Date

вероятно, лучше сделать метод addHours неизменяемым, возвращая копию объекта Date, а не мутировать его параметр.

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

таким образом, вы можете связать кучу вызовов методов, не беспокоясь о состоянии.

версия, предложенная kennebec, потерпит неудачу при изменении На или из DST, так как это номер часа, который установлен.

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

добавить h часов до this независимо от особенностей временной системы. Метод Джейсона Харвига тоже работает.

вы можете использовать momentjs http://momentjs.com/ библиотека.

var moment = require('moment');
foo = new moment(something).add(10, 'm').toDate();

есть добавить в Datejs библиотека.

и вот это JavaScript date methods. Кеннебек мудро упомянул getHours() и setHours();

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

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

проверьте, если его еще не определено, в противном случае определяет его на дату прототипа:

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

для простой функции добавления / вычитания часа / минуты в 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])

другой способ справиться с этим-преобразовать дату в unixtime (epoch), затем добавить эквивалент в (milli)секундах, а затем преобразовать его обратно. Таким образом, вы можете обрабатывать дневные и месячные переходы, например, добавлять 4 часа к 21, что должно привести к следующему дню, 01:00.

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