向JavaScript Date对象添加小时?


399

令我惊讶的是,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 hrs in ms*/)?  

不过,这似乎确实很骇人-甚至行得通吗?

Answers:


422

JavaScript本身具有可怕的日期/时间API。但是,您可以使用纯JavaScript来执行此操作:

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

奇迹般有效!谢谢
moreirapontocom

如果按照您的说法,如果您增加一个小时,使其延续到第二天,这会抓住它并适当地增加所有内容(年月日)吗?
cdoern

@cdoern我认为会这样,因为getTime()将返回毫秒,而您只需要添加毫秒数即可
The1993

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

测试:

alert(new Date().addHours(4));

25
我认为这行不通-例如在23点钟进行测试?杰森·哈维格(Jason Harwig)的答案是我想到的。
多梅尼克

11
向Java语言中的对象原型中添加内容是不好的做法,Domenic是正确的,这是行不通的。Jason Harwig的以下解决方案更好。
iKode

19
@Domenic可以在23:00正常运行,在Firefox 10,Chrome 21和IE 8/9的JavaScript控制台中进行了测试,这里是我曾经测试过的代码: var date = new Date(2012, 10, 22, 23, 0, 1); date.toString(); // Thu Nov 22 2012 23:00:01 GMT+0100 (CET) date.setHours(date.getHours() + 1); date.toString(); // Fri Nov 23 2012 00:00:01 GMT+0100 (CET) 它也可以与setMinutes()正常运行
tanguy_k 2012年

4
遇到此解决方案的问题-在DST转换点,我递增1失败(将时钟向前移动一个小时)。
andrewb 2015年

2
也被这个问题咬住了-我使用setHours(getHours-1)遍历了几个小时:现在,在DST的第一个小时,这最终是一个无限循环。因此,请检查结果!
cfstras '16

165

以下代码是要添加4小时的日期(例如今天的日期)

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

如果您尝试将4加到23(请参阅docs),则不会导致错误:

如果您指定的参数超出预期范围,则setHours()尝试相应地更新Date对象中的日期信息


我没有看到这个,并做了重复的回答。我喜欢这种方法。精确而有用。
白色的甘道夫

当小时为小数(不是整数)时,这似乎不起作用
gregmagdits

3
这是最好的答案……在Date原型中添加“ addHours”令人担忧,因为在某些时候JS可能会添加对该功能的支持,然后您会有一个冲突的原型。这使您只需使用几乎相同的代码即可获得功能。
克里斯·博伊德

感到惊讶,但实际上它会增加天数(如果需要的话),链接到文档会很有用
2oppin

4
使用大于23的小时值并不能解决这个问题,但是在夏令时的界限上还是可以解决的。鉴于它已损坏,没有理由使用它。喜欢setTime还是setUTCHour
Mark Amery

40

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

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

这样,您可以链接一堆方法调用而不必担心状态。


此功能具有与此处所述相同的问题stackoverflow.com/questions/1050720/…并不是真正意义上的功能是否适用于某些浏览器,但是其他使用Javascript的地方都将其视为问题。这一个梳理您的解决方案 stackoverflow.com/a/1050782/295535似乎是最好的解决办法
Ressu

1
您应该考虑更改函数名称,因为该词add*通常用于使对象本身发生变异。
mr5

@ mr5-对此不确定,add它在.NET Framework DateTime类中经常使用,其含义与+Math中的加号相同。
塔希尔·哈桑

1
currentDate.addHours(1)<-从我的编程本能出发,我currentDate期望值会改变,但是在您的实现中,它不会改变。至于为什么我建议重命名或将其签名更改为某些内容
mr5

1
@TahirHassan与技术细节无关,只是选择了正确的词以用作函数名称。当函数带有前缀时,我仍然更喜欢可变版本add
mr5

23

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

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

会增加h时间,而this与时间系统的特性无关。杰森·哈维格(Jason Harwig)的方法同样有效。





4

检查其是否尚未定义,否则在Date原型上对其进行定义:

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

3

处理此问题的另一种方法是将日期转换为unixtime(纪元),然后在(毫秒)秒内添加等效项,然后将其转换回。这样,您就可以处理日和月的转换,例如将21小时增加4个小时,则第二天为01:00。


您是对的-但您也迟到了几年。杰森·哈维格(Jason Harwig)的答案比您早两年展示了这种方法。这个答案没有增加任何新内容。
Mark Amery

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

该功能的56行妖怪相对于最高投票答案中两行方法有什么优势?-1,因为这里有巨大的额外复杂性,我看不到任何好处。
Mark Amery

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

0

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

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 )

-1

有点混乱,但可以!

给定这样的日期格式: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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.