Добавление часов в объект даты 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 ответов:
JavaScript имеет страшную дату/время API,. Это единственный способ сделать это на чистом JavaScript. Я бы рекомендовал использовать Datejs - как предложил Носредна - если вы делаете много манипуляций даты, хотя.
Date.prototype.addHours = function(h) { this.setTime(this.getTime() + (h*60*60*1000)); 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))));