【问题标题】:Adding hours to JavaScript Date object?向 JavaScript Date 对象添加小时数?
【发布时间】:2010-11-06 05:58:00
【问题描述】:

令我惊讶的是,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 datetime


    【解决方案1】:

    JavaScript 本身具有糟糕的日期/时间 API。尽管如此,您可以在纯 JavaScript 中做到这一点:

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

    【讨论】:

    • 如果说你增加了一个小时导致它滚动到第二天,这会抓住它并正确增加所有内容(日月年)吗?
    • 你通常把这段代码放在哪里?在应用程序的开头?
    • 一个简洁的解决方案,污染了原型,这本来可以更好地用作函数。
    • @TimWißmann 好点,但是,OP 或访问该页面的人可能不知道这是一种不好的做法,可能会导致问题。
    • 我认为至少检查 Date.prototype.addHours 是否已经存在将是强制性的常识。 if(!Date.prototype.addHours) 除此之外,我猜有些人只是喜欢把手指伸进原型??
    【解决方案2】:
    Date.prototype.addHours= function(h){
        this.setHours(this.getHours()+h);
        return this;
    }
    

    测试:

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

    【讨论】:

    • 我认为这行不通——例如,在第 23 小时的某些东西上进行测试? Jason Harwig 的回答是我想到的。
    • 在 Javascript 中向对象原型添加东西是不好的做法,Domenic 是正确的,这是行不通的。下面 Jason Harwig 的解决方案更好。
    • @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() 很好
    • 遇到了这个解决方案的问题 - 在 DST 转换点对我来说递增 1 失败(将时钟向前移动一个小时)。
    • 也被这个咬了——我用 setHours(getHours-1) 循环了几个小时:现在,在 DST 的第一个小时,这最终成为一个无限循环。所以,检查结果!
    【解决方案3】:

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

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

    如果尝试将 4 添加到 23 不会导致错误(参见docs):

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

    【讨论】:

    • 我没有看到这个并做了一个重复的答案。我喜欢这种方法。准确而实用。
    • 当小时数是小数(不是整数)时,这似乎不起作用
    • 这是最好的答案...在 Date 原型中添加“addHours”令人担忧,因为在某些时候 JS 可能会添加对该函数的支持,然后您的原型就会冲突。这使您可以使用几乎相同的代码来实现功能。
    • 很惊讶,但如果需要,它实际上会增加天数、月数,链接到文档会很有用
    • 虽然使用小时值 >23 不会破坏这一点,但它仍然是 broken at daylight savings boundaries。鉴于它已损坏,没有理由使用它;更喜欢setTimesetUTCHour
    【解决方案4】:

    最好通过返回 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 结合起来似乎是最好的解决方案
    • 你应该考虑改变函数名,因为add*这个词通常用来改变对象本身。
    • @mr5 - 不确定,add 在.NET 框架DateTime 类中使用很多,与数学中的+(加号)含义相同。
    • currentDate.addHours(1) currentDate 的值会改变,但在您的实现中,它不会。至于为什么我建议将其签名重命名或更改为某事
    • @TahirHassan 与技术细节无关,而是选择正确的词用于函数名称。当函数以 add 为前缀时,我仍然更喜欢可变版本
    【解决方案5】:

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

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

    h 小时添加到this,与时间系统特性无关。 Jason Harwig 的方法也很有效。

    【讨论】:

      【解决方案6】:

      你可以使用momentjs http://momentjs.com/库。

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

      【讨论】:

        【解决方案7】:

        在一行中获取正好 2 小时后的日期。

        您需要将毫秒传递给 newDate。

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

        【讨论】:

          【解决方案8】:

          我也认为不应该修改原始对象。因此,为了节省未来的人力,这里有一个基于Jason Harwig'sTahir Hasan 答案的组合解决方案:

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

          【讨论】:

            【解决方案9】:

            如果您想以更实用的方式(不变性)执行此操作,我将返回一个新的日期对象而不是修改现有的对象,并且我不会更改原型而是创建一个独立的函数。示例如下:

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

            【讨论】:

            • 澄清一下:new Date(date) 很重要,因为函数 setHours() 会修改原始的 date 对象,因此会产生超出此函数范围的副作用,这违反了不变性。
            【解决方案10】:

            Datejs 库中有一个添加。

            这里是JavaScript date methods。 kennebec 明智地提到了 getHours() 和 setHours();

            【讨论】:

            • 请注意,该库似乎处于 alpha 状态。
            【解决方案11】:

            检查它是否尚未定义,否则在 Date 原型上定义它:

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

            【讨论】:

              【解决方案12】:

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

              【讨论】:

              • 你是对的 - 但你也晚了几年。 Jason Harwig's answer 在你之前 2 年展示了这个方法;这个答案没有增加任何新内容。
              【解决方案13】:

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

              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 )
              

              【讨论】:

                【解决方案14】:

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

                【讨论】:

                【解决方案15】:

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

                【讨论】:

                  【解决方案16】:

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

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

                  【讨论】:

                    【解决方案17】:

                    有点乱,但它有效!

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

                    【讨论】:

                      【解决方案18】:

                      如果有人还在关注这个问题,最简单的方法是

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

                      它将在当前时间增加 2 小时。 d 的值 = 2021 年 1 月 30 日星期六 23:41:43 GMT+0500(巴基斯坦标准时间) 添加 2 小时后的 d 值 = Sun Jan 31 2021 01:41:43 GMT+0500(巴基斯坦标准时间)

                      【讨论】:

                        猜你喜欢
                        • 2023-03-04
                        • 2019-04-19
                        • 1970-01-01
                        • 2017-09-08
                        • 2023-03-25
                        • 2019-05-26
                        • 2011-11-09
                        • 1970-01-01
                        相关资源
                        最近更新 更多