如何向 JavaScript 日期对象添加 30 分钟?

IT技术 javascript date date-manipulation
2021-01-28 08:00:42

我想获得一个比另一个 Date 对象晚 30 分钟的 Date 对象。我如何用 JavaScript 做到这一点?

6个回答

使用库

如果您正在进行大量日期工作,您可能需要查看 JavaScript 日期库,如DatejsMoment.js例如,使用 Moment.js,这很简单:

var newDateObj = moment(oldDateObj).add(30, 'm').toDate();

原生 JavaScript

这就像混乱的答案,但在一行中:

var newDateObj = new Date(oldDateObj.getTime() + diff*60000);

diff你想要的分钟数与oldDateObj's 的时间差在哪里它甚至可能是负面的。

或者作为一个可重用的函数,如果你需要在多个地方这样做:

function addMinutes(date, minutes) {
    return new Date(date.getTime() + minutes*60000);
}

以防万一这不明显,我们乘以分钟的原因60000是将分钟转换为毫秒。

小心使用 Vanilla Javascript。日期很难!

您可能认为可以在日期上加上 24 小时以获得明天的日期,对吗?错误的!

addMinutes(myDate, 60*24); //DO NOT DO THIS

事实证明,如果用户遵守夏令时,一天不一定是 24 小时。一年有一天只有 23 小时,一年有一天有 25 小时。例如,在美国和加拿大的大部分地区,2014 年 11 月 2 日午夜之后的 24 小时仍然是 11 月 2 日:

const NOV = 10; //because JS months are off by one...
addMinutes(new Date(2014, NOV, 2), 60*24); //In USA, prints 11pm on Nov 2, not 12am Nov 3!

这就是为什么如果您必须为此做大量工作,使用上述库之一是更安全的选择

下面是我编写的这个函数的一个更通用的版本。我仍然建议使用库,但这对您的项目来说可能有点过分/不可能。语法以MySQL DATE_ADD函数为模型

/**
 * Adds time to a date. Modelled after MySQL DATE_ADD function.
 * Example: dateAdd(new Date(), 'minute', 30)  //returns 30 minutes from now.
 * https://stackoverflow.com/a/1214753/18511
 * 
 * @param date  Date to start with
 * @param interval  One of: year, quarter, month, week, day, hour, minute, second
 * @param units  Number of units of the given interval to add.
 */
function dateAdd(date, interval, units) {
  if(!(date instanceof Date))
    return undefined;
  var ret = new Date(date); //don't change original date
  var checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);};
  switch(String(interval).toLowerCase()) {
    case 'year'   :  ret.setFullYear(ret.getFullYear() + units); checkRollover();  break;
    case 'quarter':  ret.setMonth(ret.getMonth() + 3*units); checkRollover();  break;
    case 'month'  :  ret.setMonth(ret.getMonth() + units); checkRollover();  break;
    case 'week'   :  ret.setDate(ret.getDate() + 7*units);  break;
    case 'day'    :  ret.setDate(ret.getDate() + units);  break;
    case 'hour'   :  ret.setTime(ret.getTime() + units*3600000);  break;
    case 'minute' :  ret.setTime(ret.getTime() + units*60000);  break;
    case 'second' :  ret.setTime(ret.getTime() + units*1000);  break;
    default       :  ret = undefined;  break;
  }
  return ret;
}

工作 jsFiddle 演示

dateAdd() 函数很棒!但是我有一个注释 - 从语义上讲,单位应该是“分钟”、“秒”等,间隔应该是数量(2、10、45……),反之亦然。否则这个想法是好的。
2021-03-10 08:00:42
这非常强大;即使数字为负数,它也适用于任何分钟数。
2021-03-11 08:00:42
对于秒,乘以 1000 而不是 60k。
2021-03-25 08:00:42
这个答案不能适应月份滚动,所以 1 月 31 日加上一个月给出 2 或 3 月,这取决于它是否是闰年。Jacobi 的答案中addMonthsaddYears函数处理了这个问题,所以对我来说,这是一个更好的答案。
2021-03-25 08:00:42
@RobG 好点。我为此添加了一个修复程序,并进一步强调了“尽可能使用库”这一点。
2021-04-06 08:00:42
var d1 = new Date (),
    d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
@trevorgrayson 如果您指定的参数超出预期范围,则 setMinutes() 尝试相应地更新日期信息。例如,如果您使用 100,小时将增加 1,而 40 将用于分钟。
2021-03-13 08:00:42
@CKeene、setMinutes 和 getMinutes 是普通旧 Javascript 的一部分(尽管 datejs 确实提供了一大堆其他东西)。
2021-03-24 08:00:42
@Grant:我假设 d2 =“我想要一个 Date 对象”和 d1 =“到另一个 Date 对象”
2021-04-01 08:00:42
仅供参考 - 这可以打破夏令时的界限。JSFiddle 演示:“前进” / “后退” (感谢@Spig)
2021-04-02 08:00:42
@Jamie:您不需要两个Date对象。var d = new Date(); d.setMinutes(d.getMinutes() + 30);
2021-04-04 08:00:42

var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
console.log(newDateObj);

var in30Mins = new Date(+new Date() + 1.8e6)是单线,但不确定它是否比双线好。;-)
2021-03-13 08:00:42
请注意,setTime返回数字毫秒时间戳,而不是日期对象。(不要认为你可以做一个单线。)
2021-04-06 08:00:42
如果眨眼太微妙,+new Date()通常不建议使用:stackoverflow.com/a/221565但是,使用该链接中的信息,我相信以下内容很好:new Date(Date.now() + (30 * 60 * 1000))
2021-04-07 08:00:42

var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);

我认为setMinutes返回时间戳,但now仍然是Date对象,因此now = new Date(now)已过时
2021-03-16 08:00:42
这个问题最简单的答案
2021-03-27 08:00:42
注意到我发布了这个副本。已删除并改为 +1。
2021-04-03 08:00:42

也许是这样的?

var d = new Date();
var v = new Date();
v.setMinutes(d.getMinutes()+30);

console.log(v)

如果它循环过去一个小时,这是否可以正常工作?所以如果我在 11:59 调用它,它会在 12:29 安排好吗?
2021-03-12 08:00:42
@ChrisRae 是的,确实如此。 If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
2021-03-12 08:00:42
@Chacha102:您不需要两个Date对象。var d = new Date(); d.setMinutes(d.getMinutes() + 30);
2021-03-17 08:00:42
他想要两个日期对象。阅读问题。一个日期对象比另一个日期对象早 30 分钟。
2021-03-18 08:00:42