Ответ 1
У самого JavaScript есть ужасные API Date/Time. Тем не менее, вы можете сделать это на чистом JavaScript:
Date.prototype.addHours = function(h) {
this.setTime(this.getTime() + (h*60*60*1000));
return this;
}
Меня удивляет, что объект JavaScript Date не реализует какую-либо функцию добавления.
Я просто хочу функцию, которая может сделать это:
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*/)?
Это кажется действительно хакерским - и работает ли оно вообще?
У самого JavaScript есть ужасные API Date/Time. Тем не менее, вы можете сделать это на чистом JavaScript:
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;
}
Тест:
alert(new Date().addHours(4));
Приведенный ниже код должен добавить 4 часа к дате (пример сегодняшней даты)
var today = new Date();
today.setHours(today.getHours() + 4);
Это не приведет к ошибке, если вы попытаетесь добавить 4 к 23 (см. Документацию):
Если указанный параметр находится за пределами ожидаемого диапазона, 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();
Я также думаю, что исходный объект не следует изменять. Поэтому, чтобы спасти будущую рабочую силу, здесь комбинированное решение, основанное на Джейсон Харвиг и Тахир Хасан отвечает:
Date.prototype.addHours= function(h){
var copiedDate = new Date();
copiedDate.setTime(this.getTime() + (h*60*60*1000));
return copiedDate;
}
В библиотеке Datejs есть добавление.
А вот методы датирования JavaScript. Кеннебек мудро упомянул getHours() и setHours();
Проверьте, не определено ли это, иначе оно определено в прототипе Date:
if (!Date.prototype.addHours) {
Date.prototype.addHours = function(h) {
this.setHours(this.getHours() + h);
return this;
};
}
Другой способ справиться с этим - преобразовать дату в unixtime (epoch), затем добавить эквивалент в (милли) секунд, а затем преобразовать его обратно. Таким образом, вы можете обрабатывать дневные и месячные переходы, например, добавить 4 часа до 21, что должно привести к следующему дню, 01:00.
Для простой функции добавления/вычитания часа/минуты в 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])
Если вы не хотите использовать библиотеку и предпочитаете простое решение для JavaScript, вы можете использовать эту функцию dateAdd() я написал. Он работает с летним временем и позволяет добавлять минуты, часы, дни, недели и т.д.
Пример:
var now = Date.now();
var then = dateAdd(now, 4, 'hours');
Это вернет объект даты, увеличенный на 4 часа.
СПРБРН правильный. Для того чтобы учесть начало/конец месяца и года, вам необходимо перейти в эпоху и обратно.
Вот как вы это делаете:
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))));
Немного грязно, но это работает!
Учитывая формат даты как это: 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