为Javascript Date对象增加小时数?

时间:2009-06-26 19:08:51

标签: javascript datetime prototype-programming

让我感到惊讶的是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*/)?  

这似乎真的很骇人听闻 - 它甚至有效吗?

17 个答案:

答案 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'sTahir 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);