ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我在 js 中构建了一个小日历弹出脚本,它在 Github 上,也许可以通过代码查看日期对象是如何交互的。此外,将 Javascript Kit 视为一个很棒的 js 参考,尤其是对于日期对象。
以下所有使用 date.setMinutes(date.getMinutes() + ...) 变体的答案都将无法跨越夏令时边界。例如(假设“2014-03-09”是夏令时边界):var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30); d 现在比 f 早 30 分钟,而不是晚。
@Spig:在 DST 边界凌晨 1 点 59 分后 30 分钟是凌晨 1 点 29 分。没有错误。如果您打印 fd,您会看到一个显示“GMT-0500”,另一个显示“GMT-0400”(或任何您的时区)。此外,如果您同时在 fd 上调用 .getTime(),您会看到 f 大于 d(即稍后)。
@Spig:很有趣,在 Firefox 上尝试过,效果很好。我认为它属于 getMinutes() 应该如何工作的规范中的灰色区域。 01:89 将变为 02:29,在您“向前跃进”的那一天不存在。 Chrome 决定应该是 01:29,FF 决定 03:29。在您“回退”的那晚,两个浏览器都会跳过“回退”时间并向前跳 90 分钟,到达 02:29。以下是一些 JSFiddle 演示:"spring forward" / "fall back"
如果以下答案之一回答了您的问题,本网站的工作方式,您将“接受”答案,更多信息请点击此处:What should I do when someone answers my question?。但前提是你的问题真的得到了回答。如果没有,请考虑在问题中添加更多详细信息。

K
Kip

使用库

如果您正在做大量的日期工作,您可能需要查看 JavaScript 日期库,例如 DatejsMoment.js。例如,对于 Moment.js,这很简单:

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

香草 Javascript

这类似于 chaos's answer,但在一行中:

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

其中 diff 是您希望与 oldDateObj 的时间相差的分钟数。它甚至可以是负面的。

或者作为可重用功能,如果您需要在多个地方执行此操作:

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

Working jsFiddle demo


这是非常强大的;即使数字为负数,它也适用于任何分钟数。
对于秒,乘以 1000 而不是 60k。
dateAdd() 函数很棒!但是我有一个注释 - 从语义上讲,单位应该是“分钟”、“秒”等,而间隔应该是数量(2、10、45,...),反之亦然。否则这个想法是好的。
这个答案无法适应月份翻转,因此 1 月 31 日加一个月会给出 2 月 3 日或 3 月 3 日,具体取决于它是否是闰年。 Jacobi 的答案中的 addMonths 和 addYears 函数处理了这个问题,所以对我来说,这是一个更好的答案。
@RobG 好点。我为此添加了一个修复程序,并进一步强调了“如果可能,请使用库”这一点。
G
GirkovArpa
var d1 = new Date (),
    d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );

@Jamie:您不需要两个 Date 对象。 var d = new Date(); d.setMinutes(d.getMinutes() + 30);
@Grant:我假设 d2 =“我想得到一个 Date 对象”和 d1 =“到另一个 Date 对象”
@CKeene、setMinutes 和 getMinutes 是普通旧 Javascript 的一部分(尽管 datejs 确实提供了一大堆其他东西)。
仅供参考-这可以突破夏令时界限。 JSFiddle 演示:"spring forward" / "fall back"(感谢@Spig)
@trevorgrayson 如果您指定的参数超出预期范围, setMinutes() 会尝试相应地更新日期信息。例如,如果您使用 100,则小时数将增加 1,而 40 将用于分钟数。
h
hashed_name

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


请注意,setTime 返回数字毫秒时间戳,而不是日期对象。 (不要以为你可以做一个单行。)
var in30Mins = new Date(+new Date() + 1.8e6) 是单衬,但不确定它是否比双衬更好。 ;-)
如果眨眼的脸太微妙,通常不建议使用 +new Date()stackoverflow.com/a/221565 但是,使用该链接中的信息,我相信以下是可以的:new Date(Date.now() + (30 * 60 * 1000))
返回日期 - new Date(newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000)));
h
hashed_name

var now = new Date(); now.setMinutes(now.getMinutes() + 30); // 现在时间戳 = new Date(now); // 日期对象 console.log(now);


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

也许是这样的?

var d = 新日期(); var v = 新日期(); v.setMinutes(d.getMinutes()+30);控制台.log(v)


@Chacha102:您不需要两个 Date 对象。 var d = new Date(); d.setMinutes(d.getMinutes() + 30);
他想要两个约会对象。阅读问题。一个日期对象,它比另一个日期对象早 30 分钟。
如果它循环超过一个小时,这行得通吗?所以如果我在 11:59 打电话,它在 12:29 安排好了吗?
@ChrisRae 是的,确实如此。 If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
a
ashleedawg

我总是创建 7 个函数来处理 JS 中的日期:
addSecondsaddMinutesaddHoursaddDaysaddWeeksaddMonthsaddYears

您可以在此处查看示例:http://jsfiddle.net/tiagoajacobi/YHA8x/

如何使用:

var now = new Date();
console.log(now.addMinutes(30));
console.log(now.addWeeks(3));

这些是功能:

Date.prototype.addSeconds = function(seconds) {
  this.setSeconds(this.getSeconds() + seconds);
  return this;
};

Date.prototype.addMinutes = function(minutes) {
  this.setMinutes(this.getMinutes() + minutes);
  return this;
};

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

Date.prototype.addDays = function(days) {
  this.setDate(this.getDate() + days);
  return this;
};

Date.prototype.addWeeks = function(weeks) {
  this.addDays(weeks*7);
  return this;
};

Date.prototype.addMonths = function (months) {
  var dt = this.getDate();
  this.setMonth(this.getMonth() + months);
  var currDt = this.getDate();
  if (dt !== currDt) {  
    this.addDays(-currDt);
  }
  return this;
};

Date.prototype.addYears = function(years) {
  var dt = this.getDate();
  this.setFullYear(this.getFullYear() + years);
  var currDt = this.getDate();
  if (dt !== currDt) {  
    this.addDays(-currDt);
  }
  return this;
};

任何人都可以看到这种方法有任何问题吗?
改用 moment.js
@TheDembinski——你期待什么问题?通常不喜欢扩展内置插件,但我看不出 Date 有问题。如果每个主要增量也可以选择设置其次要增量(如 set* 方法所做的那样),那就太好了,所以 addHours 可以选择花费分钟、秒和毫秒,这样你就可以执行 date.addHours(3, 30) 增加 3 小时 30 分钟。 addYears 需要几年、几个月和几天,addMonths 需要几个月和几天,addMinutes 需要分钟、秒、毫秒等。
嗨@transformer我会做这样的事情new Date().addHours(4).addMinutes(45);你可以调用尽可能多的,因为这些方法返回“this”,它是当前的日期对象。
嗨@transformer,我不确定我是否理解您的问题,但这些是原型函数,您可以按您想要的任何顺序使用,例如:var dt = new Date(); 然后 dt.addMinutes(45); dt.addHours(4); 甚至 dt.addMinutes(285);dt.addMinutes(45).addHours(4); 都可以工作。如果您对某些代码示例有疑问,请在此处发布您的问题,我很乐意为您提供帮助。
M
Mansour Alnasser

一行代码

  var afterSomeMinutes = new Date(new Date().getTime() + minutes * 60000);

其中 minutes 是一个数字


D
Duncan Lukkenaer

停止使用 Moment.js

正如其他出色答案所建议的那样,在大多数情况下,最好在处理日期时使用库。但是,重要的是要知道,截至 2020 年 9 月,Moment.js 被视为旧版,不应再用于新项目。

在他们的 official docs 中引用 Moment 的声明:

我们希望阻止 Moment 被用于未来的新项目。 [...] 我们现在通常认为 Moment 是一个处于维护模式的遗留项目。它没有死,但它确实完成了。

现代图书馆

以下是 Moment 推荐的替代方案。

卢克森

Luxon 可以被认为是 Moment 的演变。它由 Moment 的长期贡献者 Isaac Cambron 撰写。请阅读 Luxon 文档中的 Why does Luxon exist?For Moment users 页。

语言环境:国际提供

时区:国际提供

import {DateTime} from 'luxon'

function addMinutes(date, minutes) {
    return DateTime.fromJSDate(date).plus({minutes}).toJSDate()
}

Day.js

Day.js 旨在成为 Moment.js 的简约替代品,使用类似的 API。它不是直接替代品,但如果您习惯使用 Moment 的 API 并希望快速上手,请考虑使用 Day.js。

语言环境:可以单独导入的自定义数据文件

时区:国际提供,通过插件

import dayjs from 'dayjs'

function addMinutes(date, minutes) {
    return dayjs(date).add(minutes, 'minutes').toDate()
}

日期-fns

Date-fns 提供了一系列用于操作 JavaScript Date 对象的函数。有关更多详细信息,请滚动至“为什么选择 date-fns?”在 date-fns 主页上。

语言环境:可以单独导入的自定义数据文件

时区:国际提供,通过单独的配套库

import {addMinutes} from 'date-fns'

function addMinutesDemo(date, minutes) {
    return addMinutes(date, minutes)
}

js-乔达

js-Joda 是 Java Three-Ten Backport 的 JavaScript 端口,它是 Java SE 8 java.time 包的 JSR-310 实现的基础。如果您熟悉 java.timeJoda-TimeNoda Time,您会发现 js-Joda 具有可比性。

语言环境:通过附加模块自定义数据文件

时区:通过附加模块自定义数据文件

import {LocalDateTime, nativeJs, convert} from '@js-joda/core'

function addMinutes(date, minutes) {
    return convert(
        LocalDateTime.from(
            nativeJs(date)
        ).plusMinutes(minutes)
    ).toDate()
}

@Koslun 感谢您的反馈。我为每个库添加了一个示例。
因为一个库已经完成并不意味着你应该停止使用它。如果它完成了,那只会意味着它是稳定的。唯一更多使用的理由是代替仍在开发中的有错误的库。
@NielsLucas 正如 Moment 作者自己所提到的,不鼓励将包用于新项目。你仍然可以使用它,但有更多更好、更现代的替代品可用。这些更新的事实并不一定意味着它们包含更多错误。
t
tsacodes

最简单的解决方法是认识到在 javascript 中日期只是数字。它开始 0'Wed Dec 31 1969 18:00:00 GMT-0600 (CST)。每 1 代表一毫秒。您可以通过获取值并使用该值实例化新日期来增加或减少毫秒。有了这种想法,您就可以很容易地管理它。

const minutesToAdjust = 10;
const millisecondsPerMinute = 60000;
const originalDate = new Date('11/20/2017 10:00 AM');
const modifiedDate1 = new Date(originalDate.valueOf() - (minutesToAdjust * millisecondsPerMinute));
const modifiedDate2 = new Date(originalDate.valueOf() + (minutesToAdjust * millisecondsPerMinute));

console.log(originalDate); // Mon Nov 20 2017 10:00:00 GMT-0600 (CST)
console.log(modifiedDate1); // Mon Nov 20 2017 09:50:00 GMT-0600 (CST)
console.log(modifiedDate2); // Mon Nov 20 2017 10:10:00 GMT-0600 (CST)

是的,我认为这个答案真的被低估了。所有其他解决方案似乎都使问题过于复杂。
当您只需要添加时间时这很好,但是当您需要添加天/月/年时它不会帮助您。
C
C B

单线无公用事业:

new Date(+new Date() + 60000*15) // +15 minutes

看起来非常类似于 stackoverflow.com/a/67955616/616443
J
Jonathan

这就是我所做的,似乎效果很好:

Date.prototype.addMinutes = function(minutes) {
    var copiedDate = new Date(this.getTime());
    return new Date(copiedDate.getTime() + minutes * 60000);
}

然后你可以这样称呼它:

var now = new Date();
console.log(now.addMinutes(50));

你可以只做 return new Date(this.getTime() + minutes * 60000);,我不需要临时 copiedDate。 ;-)
A
Abdulrahman Fawzy

您应该获取当前日期的值以获取带有 (ms) 的日期并将 (30 * 60 *1000) 添加到它。现在你有(当前日期 + 30 分钟)与 ms

console.log('with ms', Date.now() + (30 * 60 * 1000)) console.log('new Date', new Date(Date.now() + (30 * 60 * 1000)))


J
James

它很简单;

let initial_date = new Date;
let added30Min = new Date(initial_date.getTime() + (30*60*1000));

x
xameeramir

这是 ES6 版本:

let getTimeAfter30Mins = () => {
  let timeAfter30Mins = new Date();
  timeAfter30Mins = new Date(timeAfter30Mins.setMinutes(timeAfter30Mins.getMinutes() + 30));
};

像这样称呼它:

getTimeAfter30Mins();

我让用户输入 4:30 小时 + 2:15 小时/分钟,我怎样才能让用户通过小时和分钟并将其添加到现有的小时分钟。
@transformer 您可以为小时、分钟等提供不同的输入字段,以进行数字验证。
u
unsynchronized

我觉得这里的许多答案都缺乏创造性的成分,而这对于时间旅行计算来说是非常需要的。我提出了 30 分钟时间翻译的解决方案。

(jsfiddle here

function fluxCapacitor(n) {
    var delta,sigma=0,beta="ge";
    (function(K,z){

        (function(a,b,c){
            beta=beta+"tT";
            switch(b.shift()) {
                case'3':return z('0',a,c,b.shift(),1);
                case'0':return z('3',a,c,b.pop());
                case'5':return z('2',a,c,b[0],1);
                case'1':return z('4',a,c,b.shift());
                case'2':return z('5',a,c,b.pop());
                case'4':return z('1',a,c,b.pop(),1);
            }
        })(K.pop(),K.pop().split(''),K.pop());
    })(n.toString().split(':'),function(b,a,c,b1,gamma){
       delta=[c,b+b1,a];sigma+=gamma?3600000:0; 
       beta=beta+"im";
    });
    beta=beta+"e";
    return new Date (sigma+(new Date( delta.join(':')))[beta]());
}

我不得不承认这是有创意的。但是人..这很难读!
J
Jason Mullings

这是我的单行:

console.log('time:', new Date(new Date().valueOf() + 60000))


r
rayalois22

你可以这样做:

让 30 分钟 = 30 * 60 * 1000; // 将 30 分钟转换为毫秒 let date1 = new Date();让 date2 = 新日期(date1.getTime() + 三十分钟);控制台.log(date1);控制台.log(date2);


A
Adnane Ar

我知道这个话题太老了。但我很确定仍有一些开发人员需要这个,所以我为你制作了这个简单的脚本。我希望你喜欢它!

您好,现在是 2020 年,我添加了一些修改,希望现在对您有所帮助!

再次您好,现在是 2022 年,我再次回来解决一些问题并为方法和函数提供更好的命名。

函数 addTimeToDate(addTime, date){ let generatedTime = date.getTime(); if(addedTime.seconds) generatedTime += 1000 * addedTime.seconds; //检查额外的秒数 if(addedTime.minutes) generatedTime += 1000* 60 * addedTime.minutes;//检查额外的分钟数 if(addedTime.hours) generatedTime += 1000 * 60 * 60 * addedTime.hours;//检查额外小时返回新日期(生成时间); } Date.prototype.addTime = function(addedTime){ return addTimeToDate(addedTime, this); } let futureDate = new Date().addTime({ hours: 16, //加一小时分:45,//加四十五分秒:0 //加0秒返回不加任何秒,所以我们可以删除它. });


@AdnaneAr:先生,您能告诉我如何在这种时间格式中将分钟添加到上午 8:00 吗?
@Kapilsoni Date.prototype.toAmericanFormat = function(){ const halfDay = 12;让 isAfternoon = false; if( this.getHours() > 12 ) { isAfternoon = true; } 返回 ${!isAfternoon?this.getHours():this.getHours()-halfDay}:${this.getMinutes()}${isAfternoon?'PM':'AM'}; }
我不知道这是否是您要求的正确答案,但我刚刚为您编写了这个简单的函数。它可以像这样使用:new Date().strtotime({hours: 8, minutes: 25}).toAmericanFormat();
O
Ouroborus

使用已知的现有库来处理处理时间计算所涉及的怪癖。我目前最喜欢的是moment.js

<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.js"></script>
<script>
 var now = moment(); // get "now"
 console.log(now.toDate()); // show original date
 var thirty = moment(now).add(30,"minutes"); // clone "now" object and add 30 minutes, taking into account weirdness like crossing DST boundries or leap-days, -minutes, -seconds.
 console.log(thirty.toDate()); // show new date
</script>

如果您在没有给出理由的情况下投反对票,答案将无法改善。
OP 要求提供 JavaScript 解决方案,而不是框架/库。
@mattpark22 虽然我理解您的意思,但 javascript 库仍然是 javascript。我可以只删除库的相关部分并将它们作为代码解决方案呈现。 OP 的答案是 javascript,就您的意思而言,但不知道(可能)可接受的通用解决方案。此外,增加 30 分钟并不像大多数答案所说的那样微不足道,因为 Date 对象没有处理很多边缘情况。例如,最流行的答案在跨越 DST 边界时会中断。
@Ouroborus——如果 OP 没有要求 OP 或标签中的库,则库不应该是唯一提供的解决方案。否则,答案可能只是在不同库中做某事的一连串方法,并且 OP 对他们的实际问题没有任何智慧(在这种情况下,解决这个问题相当简单)。
@RobG 没有人建议只提供图书馆解决方案。 OP 不能专门要求图书馆,因为这会导致问题偏离主题。询问“我如何使用 JavaScript 做到这一点?”可以解释为指定这是特定于 javascript 的(要求使用特定语言的解决方案,而不是要求原始代码解决方案),特别是考虑到此细节在标题和标签中重复。
I
ISK
var add_minutes =  function (dt, minutes) {
return new Date(dt.getTime() + minutes*60000);
}
 console.log(add_minutes(new Date(2014,10,2), 30).toString());

非常有用,我们甚至可以使用 Date.parse(string) 发送从字符串解析的日期,然后将结果格式化回适当的字符串
p
phentnil

“添加” 30 分钟的一种方法是创建第二个日期对象(主要用于演示)和 set the minutesminutes + 30。如果第一次距离下一个小时不到 30 分钟,这也将考虑调整小时。 (即 4:455:15

const first = new Date(); console.log("第一次约会:", first.toString()); const second = new Date(first); const newMinutes = second.getMinutes() + 30; console.log("新分钟数:", newMinutes); second.setMinutes(newMinutes); console.log("第二个日期:", second.toString());


B
Blaskovicz

对于像我这样的懒人:

Kip 在咖啡脚本中的回答(从上面),使用“枚举”,并在同一个对象上操作:

Date.UNIT =
  YEAR: 0
  QUARTER: 1
  MONTH: 2
  WEEK: 3
  DAY: 4
  HOUR: 5
  MINUTE: 6
  SECOND: 7
Date::add = (unit, quantity) ->
  switch unit
    when Date.UNIT.YEAR then @setFullYear(@getFullYear() + quantity)
    when Date.UNIT.QUARTER then @setMonth(@getMonth() + (3 * quantity))
    when Date.UNIT.MONTH then @setMonth(@getMonth() + quantity)
    when Date.UNIT.WEEK then @setDate(@getDate() + (7 * quantity))
    when Date.UNIT.DAY then @setDate(@getDate() + quantity)
    when Date.UNIT.HOUR then @setTime(@getTime() + (3600000 * quantity))
    when Date.UNIT.MINUTE then @setTime(@getTime() + (60000 * quantity))
    when Date.UNIT.SECOND then @setTime(@getTime() + (1000 * quantity))
    else throw new Error "Unrecognized unit provided"
  @ # for chaining

g
gildniy

这是 IsoString 版本:

console.log(new Date(new Date().setMinutes(new Date().getMinutes() - (30))).toISOString());


G
German Gracia

其他解决方案:

var dateAv = new Date();
var endTime = new Date(dateAv.getFullYear(), dateAv.getMonth(), dateAv.getDate(), dateAv.getHours(), dateAv.getMinutes() + 30);
          

J
Jim Davis

只是另一种选择,我写道:

DP_DateExtensions Library

如果这是您需要的所有日期处理,那就太矫枉过正了,但它会做您想做的事。

支持日期/时间格式、日期数学(添加/减去日期部分)、日期比较、日期解析等。它是自由开源的。


D
DolDurma

您只需将此代码与 momnet 库一起使用:

console.log(moment(moment()).add(30,"minutes").format('MM/DD/YYYY hh:mm:ss'));

I
ISK
var myDate= new Date();
var MyNewDate = new Date 
(myDate.getFullYear(),myDate.getMonth(),myDate.getDate(),myDate.getMinutes()+10,01,01)

请在您的答案中添加一些解释,以便其他人可以从中学习