向 JavaScript Date 对象添加小时数?

IT技术 javascript datetime
2021-01-15 00:56:28

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

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

6个回答

JavaScript 本身有糟糕的日期/时间 API。尽管如此,您可以在纯 JavaScript 中执行此操作:

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

测试:

alert(new Date().addHours(4));
我认为这行不通——例如,在 23 小时的某个时间进行测试?Jason Harwig 的回答是我想到的。
2021-03-13 00:56:28
也被这个咬了——我通过使用 setHours(getHours-1) 循环了几个小时:现在,在第一个 DST 小时,这最终是一个无限循环。所以,检查结果!
2021-03-14 00:56:28
@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()
2021-03-16 00:56:28
在 Javascript 中向对象原型添加东西是不好的做法,Domenic 是正确的,这行不通。Jason Harwig 下面的解决方案更好。
2021-04-01 00:56:28
遇到此解决方案的问题 - 在 DST 转换点(将时钟向前移动一小时)对我来说递增 1 失败。
2021-04-08 00:56:28

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

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

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

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

我没有看到这个并做了重复的答案。我喜欢这个方法。准确而有用。
2021-03-11 00:56:28
惊讶,但它实际上增加了天数,如果需要的话,链接到文档会很有用
2021-03-19 00:56:28
这是这里的最佳答案...将“addHours”添加到 Date 原型令人担忧,因为在某些时候 JS 可能会添加对该函数的支持,然后您会遇到一个冲突的原型。这为您提供了使用几乎相同代码的功能。
2021-04-02 00:56:28
当小时数是小数(不是整数)时,这似乎不起作用
2021-04-04 00:56:28
虽然使用 >23 的小时值不会破坏这一点,但它仍然在夏令时边界被破坏鉴于它坏了,没有理由使用它;更喜欢setTimesetUTCHour
2021-04-07 00:56:28

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

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

通过这种方式,您可以链接一堆方法调用而无需担心状态。

您应该考虑更改函数名称,因为该词add*通常用于改变对象本身。
2021-03-18 00:56:28
这个函数有和这里提到的一样的问题stackoverflow.com/questions/1050720/...这并不是关于它是否在某些浏览器上工作,但其他使用 Javascript 的地方认为这是一个问题。将您的解决方案与这个解决方案结合起来 stackoverflow.com/a/1050782/295535似乎是最好的解决方案
2021-03-22 00:56:28
currentDate.addHours(1)<- 根据我的编程本能,我currentDate期望值会改变,但在您的实现中,它不会。至于为什么我建议重命名或将其签名更改为某些内容
2021-03-26 00:56:28
@TahirHassan 与技术细节无关,而是选择了用于函数名称的正确单词。当函数带有前缀时,我仍然更喜欢可变版本add
2021-04-02 00:56:28
@mr5 - 不确定,add在 .NET 框架DateTime类中经常使用,并且与+Math 中(plus)具有相同的含义
2021-04-08 00:56:28

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

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

将增加h时间以this独立于时间系统特性。Jason Harwig 的方法同样有效。