让我感到惊讶的是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*/)?
这似乎真的很骇人听闻 - 它甚至有效吗?
答案 0 :(得分:350)
Date.prototype.addHours= function(h){
this.setHours(this.getHours()+h);
return this;
}
测试:
alert(new Date().addHours(4));
答案 1 :(得分:315)
JavaScript本身具有可怕的日期/时间API。这是在纯JavaScript中实现它的唯一方法。我推荐使用Datejs - 正如Nosredna所建议的那样 - 如果你正在做很多日期操作的话。
Date.prototype.addHours = function(h) {
this.setTime(this.getTime() + (h*60*60*1000));
return this;
}
答案 2 :(得分:102)
以下代码是迄今为止添加4小时(例如今天的例子' s日期)
var today = new Date();
today.setHours(today.getHours() + 4);
如果您尝试添加4到23,则不会导致错误(请参阅docs):
如果您指定的参数超出预期范围,setHours()会尝试相应地更新Date对象中的日期信息
答案 3 :(得分:39)
最好通过返回Date对象的副本而不是改变其参数来使addHours方法不可变。
Date.prototype.addHours= function(h){
var copiedDate = new Date(this.getTime());
copiedDate.setHours(copiedDate.getHours()+h);
return copiedDate;
}
这样你可以链接一堆方法调用而不用担心状态。
答案 4 :(得分:18)
当更改到DST或从DST更改时,kennebec建议的版本将失败,因为它是设置的小时数。
this.setUTCHours(this.getUTCHours()+h);
会将h
小时添加到this
,而与时间系统的特性无关。
Jason Harwig的方法也适用。
答案 5 :(得分:16)
您可以使用momentjs http://momentjs.com/库。
var moment = require('moment');
foo = new moment(something).add(10, 'm').toDate();
答案 6 :(得分:7)
我还认为不应该修改原始对象。因此,为了节省未来的人力,这是一个基于Jason Harwig's和Tahir Hasan答案的综合解决方案:
Date.prototype.addHours= function(h){
var copiedDate = new Date();
copiedDate.setTime(this.getTime() + (h*60*60*1000));
return copiedDate;
}
答案 7 :(得分:6)
Datejs库中有一个添加内容。
以下是JavaScript date methods。 kennebec明智地提到了getHours()和setHours();
答案 8 :(得分:5)
在一行中获取距离现在正好 2 小时的日期。
let expiryDate = new Date(new Date().setHours(new Date().getHours() + 2));
let nowDate = new Date();
let expiryDate = new Date(new Date().setHours(new Date().getHours() + 2));
console.log('now', nowDate);
console.log('now', expiryDate);
答案 9 :(得分:4)
检查它是否已经定义,否则在Date原型上定义:
if (!Date.prototype.addHours) {
Date.prototype.addHours = function(h) {
this.setHours(this.getHours() + h);
return this;
};
}
答案 10 :(得分:4)
如果您想以更具功能性的方式(不变性)做到这一点,我将返回一个新的date对象,而不是修改现有的对象,并且我不会更改原型,而是创建一个独立的函数。这是示例:
//JS
function addHoursToDate(date, hours) {
return new Date(new Date(date).setHours(date.getHours() + hours));
}
//TS
function addHoursToDate(date: Date, hours: number): Date {
return new Date(new Date(date).setHours(date.getHours() + hours));
}
let myDate = new Date();
console.log(myDate)
console.log(addHoursToDate(myDate,2))
答案 11 :(得分: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])
答案 12 :(得分:3)
这是获取递增或递减数据值的简便方法。
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 )
答案 13 :(得分:2)
另一种处理方法是将日期转换为unixtime(epoch),然后在(milli)秒内添加等效值,然后将其转换回来。通过这种方式,您可以处理日期和月份转换,例如将时间增加4小时至21,这将导致第二天01:00。
答案 14 :(得分:1)
SPRBRN是正确的。为了说明月份和年份的开始/结束,您需要转换为Epoch并返回。
这是您的操作方式:
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))));
答案 15 :(得分:0)
有点混乱,但是可以!
给出这样的日期格式: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
答案 16 :(得分:-2)
如果有人仍在研究此问题,最简单的方法是
var d = new Date();
d.setHours(15);