为Javascript Date对象增加小时数?

Jef*_*ang 353 javascript datetime

我很惊讶Javascript的Date对象没有实现任何类型的添加功能.

我只想要一个可以做到这一点的函数:

var now = Date.now();
var fourHoursLater = now.addHours(4);

function Date.prototype.addHours(h) {

   // how do I implement this?  

}
Run Code Online (Sandbox Code Playgroud)

我只想在一个方向上指点一些.

  • 我需要进行字符串解析吗?

  • 我可以使用setTime吗?

  • 毫秒怎么样?

像这样:

new Date(milliseconds + 4*3600*1000 /*4 hrs in ms*/)?  
Run Code Online (Sandbox Code Playgroud)

这看起来真的很乱 - 它甚至可以工作吗?

ken*_*bec 364

Date.prototype.addHours= function(h){
    this.setHours(this.getHours()+h);
    return this;
}
Run Code Online (Sandbox Code Playgroud)

测试:

alert(new Date().addHours(4));
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这有效 - 例如,在第23小时测试一下吗?Jason Harwig的回答是我想到的. (21认同)
  • @Domenic这在23:00工作正常,在Firefox 10,Chrome 21和IE 8/9的JavaScript控制台内测试这里我用来测试的代码:`var date = new Date(2012,10,22,23) ,0,1); date.toString(); // 2012年11月22日星期四23:00:01 GMT + 0100(CET)date.setHours(date.getHours()+ 1); date.toString(); //星期五2012年11月23日00:00:01 GMT + 0100(CET)`它也适用于setMinutes() (19认同)
  • 在Javascript中将对象添加到对象原型是不好的做法,而Domenic是正确的,这不起作用.Jason Harwig的解决方案更好. (11认同)
  • 考虑到这个解决方案的问题 - 在DST转换点(将时钟向前移动一小时),我的失败增加了1. (4认同)
  • 哇 - 比我想象的要容易. (2认同)
  • 也被这个咬了 - 我通过使用setHours(getHours-1)循环了几个小时:现在,在DST小时,这最终成为一个无限循环.所以,检查结果! (2认同)

Jas*_*wig 354

JavaScript本身具有可怕的日期/时间API.这是在纯JavaScript中实现它的唯一方法.我推荐使用Datejs - 正如Nosredna建议的那样 - 如果你正在做很多日期操作的话.

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

  • 一个简洁的解决方案会污染原型,这最好用作函数。 (11认同)
  • 不建议修改原型。 (5认同)
  • 你通常把这段代码放在哪里?在应用程序的开头? (3认同)
  • @TimWißmann 好点,但是,OP 或访问该页面的人可能不知道这是一种不好的做法,可能会导致问题。 (3认同)
  • 我认为至少检查 Date.prototype.addHours 是否已经存在将是强制性的常识。if(!Date.prototype.addHours) 除此之外,我猜有些人只是喜欢把手指伸进原型 (2认同)

Sup*_*ova 134

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

var today = new Date();
today.setHours(today.getHours() + 4);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是最好的答案...在Date原型中添加"addHours"令人担忧,因为在某些时候JS可能会添加对该函数的支持,然后你就会有一个冲突的原型.这为您提供了使用尽可能多的代码的功能. (3认同)
  • 我没有看到这个并做了重复的答案。我喜欢这个方法。精确而有用。 (2认同)
  • 使用大于23的小时值并不能解决这个问题,但这仍然[在夏令时时限打破了](/sf/ask/73550431/#comment102500929_1051641)。鉴于它已损坏,没有理由使用它。更喜欢`setTime`或`setUTCHour`。 (2认同)

Tah*_*san 39

最好通过返回Date对象的副本而不是改变其参数来使addHours方法不可变.

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

这样你可以链接一堆方法调用而不用担心状态.


pet*_*ter 21

更改为DST或来自DST时,kennebec建议的版本将失败,因为它是设置的小时数.

this.setUTCHours(this.getUTCHours()+h);
Run Code Online (Sandbox Code Playgroud)

将增加h几小时,以this独立于时间系统的特点.Jason Harwig的方法也适用.


Cma*_*mag 18

您可以使用momentjs http://momentjs.com/ Library.

var moment = require('moment');
foo = new moment(something).add(10, 'm').toDate();
Run Code Online (Sandbox Code Playgroud)

  • 时刻很可爱 (3认同)

Pat*_*aut 8

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

//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))
Run Code Online (Sandbox Code Playgroud)


jam*_*ace 8

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

您需要将毫秒数传递给 newDate。

let expiryDate = new Date(new Date().setHours(new Date().getHours() + 2));
        or
let expiryDate2 = new Date(Date.now() + 2 * (60 * 60 * 1000) );
Run Code Online (Sandbox Code Playgroud)

let expiryDate = new Date(new Date().setHours(new Date().getHours() + 2));
        or
let expiryDate2 = new Date(Date.now() + 2 * (60 * 60 * 1000) );
Run Code Online (Sandbox Code Playgroud)


Edw*_*san 7

我也认为原始对象不应该被修改.因此,为了节省未来的人力,这是基于Jason HarwigTahir Hasan答案的综合解决方案:

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


Nos*_*dna 5

Datejs库中有一个添加.

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