如何向日期对象添加小时?

JavaScript的Date对象没有实现任何类型的add函数,这让我感到惊讶。

我只是想要一个函数,可以这样做:

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 hours in ms */)?

这看起来真的很奇怪——它真的有用吗?

779918 次浏览

Datejs库中有一个添加。

这是JavaScript日期方法。kennebec明智地提到了getHours()和setHours();

JavaScript本身有糟糕的日期/时间API。尽管如此,你可以在纯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));

通过返回Date对象的副本而不是改变其参数,使addHours方法不可变可能会更好。

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

通过这种方式,您可以将一堆方法调用链接起来,而不用担心状态。

处理此问题的另一种方法是将日期转换为unix时间(epoch),然后以(milli)秒为单位添加等效日期,然后将其转换回来。通过这种方式,您可以处理日期和月份的转换,例如将4小时加到21小时,结果应该是第二天01:00。

版本kennebec建议在更改为DST或从DST时将失败,因为它是设置的小时数。

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

将添加h小时到this独立的时间系统特性。

Jason Harwig的方法也可以。

您可以使用Moment.js库。

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

我也认为原来的对象不应该被修改。因此,为了节省未来的人力,这里有一个基于杰森Harwig的Tahir哈桑答案的联合解决方案:

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

检查它是否还没有定义。否则,在Date原型中定义它:

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

下面的代码将为一个日期增加4个小时(例如今天的日期):

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

如果你尝试将4添加到23(参见的文档),它不会导致错误:

如果指定的参数超出预期范围,setHours()将尝试更新date对象中的日期信息

对于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])

# EYZ0正确。为了解释月和年的开始/结束,您需要转换为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*days);


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-03 t16 . 58

这是一种获取递增或递减数据值的简单方法。

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)

如果你想在一个更功能性的方式(不可变性),我会返回一个新的日期对象,而不是修改现有的,我不会改变原型,而是创建一个独立的函数。下面是例子:

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

最简单的方法是:

var d = new Date();
d = new Date(d.setHours(d.getHours() + 2));

它将使当前时间增加2小时。

d = Sat Jan 30 2021 23:41:43 GMT+0500(巴基斯坦标准时间)。

d加2小时后的值= 2021年1月31日01:41:43 GMT+0500(巴基斯坦标准时间)。

两小时后找个约会对象,一句话。

您需要向新的日期传递毫秒数。

let expiryDate = new Date(new Date().setHours(new Date().getHours() + 2));


or


let expiryDate2 = new Date(Date.now() + 2 * (60 * 60 * 1000) );

let nowDate = new Date();
let expiryDate = new Date(new Date().setHours(new Date().getHours() + 2));
let expiryDate2 = new Date(Date.now() + 2 * (60 * 60 * 1000) );


console.log('now', nowDate);
console.log('expiry', expiryDate);
console.log('expiry 2', expiryDate2);

如果你需要它作为一个字符串,例如:

var defaultTime: new Date().getHours() + 1 + ":" + new Date().getMinutes();

我觉得这个应该能搞定

 var nextHour  = Date.now() + 1000 * 60 * 60;