如何从 JavaScript 中的日期中减去分钟?

IT技术 javascript
2021-03-11 05:36:35

我如何才能将此伪代码转换为有效的 JS [不要担心结束日期来自哪里,除非它是一个有效的 JavaScript 日期]。

var myEndDateTime = somedate;  //somedate is a valid JS date  
var durationInMinutes = 100; //this can be any number of minutes from 1-7200 (5 days)

//this is the calculation I don't know how to do
var myStartDate = somedate - durationInMinutes;

alert("The event will start on " + myStartDate.toDateString() + " at " + myStartDate.toTimeString());
6个回答

一旦你知道这一点:

  • 您可以Date通过自 1970 年 1 月 1 日起以毫秒为单位调用构造函数来创建 a
  • valueOf()一个Date是自1970年1月1日的毫秒数
  • 60,000一分钟几毫秒:-]

在下面的代码中,Date通过从 中减去适当的毫秒数来创建一个新的myEndDateTime

var MS_PER_MINUTE = 60000;
var myStartDate = new Date(myEndDateTime - durationInMinutes * MS_PER_MINUTE);
它有效...但有一个问题,Date() 构造函数有 3 个选项,即 1:空 2:字符串和 3:数字年份,数字月份......所以上面使用的那个遵循哪个构造函数?
2021-04-27 05:36:35
举个例子说明这会如何出错,使用欧洲/伦敦作为时区语言环境:var d = new Date("2017-10-29 01:50:00"), e = new Date(d.getTime() + 20 * 60000);您希望e02:10:00,对吗?不。01:10:00. 夏令时问好。然后是闰秒...
2021-04-29 05:36:35
你也可以使用 var myStartDate = somedate.addMinutes(-durationInMuntes);我假设 somedate 是一个 Date 对象
2021-04-30 05:36:35
但是当你添加分钟时不会处理。要在添加分钟时正确处理,您应该使用.getTime(). 例子:var myStartDate = new Date(myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);
2021-05-04 05:36:35
2021-05-06 05:36:35

您还可以使用 get 和 set 分钟来实现它:

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

startdate.setMinutes(endDate.getMinutes() - durationInMinutes);
这对我更有用,我想从通过构造函数以特定方式设置的现有 Date 对象实例中减去时间。谢谢!
2021-05-03 05:36:35
值得注意的是,setMinutes()它足够聪明,可以正确处理负分钟数。因此,如果开始日期是 3:05,并且您想减去 30 分钟,您将传入-25setMinutes(),它足够聪明地知道3:-252:35. (即它不会抛出异常。)
2021-05-04 05:36:35
当我尝试 startDate = endDate 时,我在类似的用例中得到了错误的值。看起来像发生浅拷贝的问题
2021-05-04 05:36:35
请记住,.setMinutes(...)强制处理int值。如果您设置1.5 minutes为 aDate它只会设置1 minute并保持与以前相同的秒数。
2021-05-05 05:36:35
@Kip - 谢谢,这是使这个答案值得的洞察力。但是所有浏览器都保证这一点吗?我问是因为 MDN 说只允许 0 - 59 - 但我怀疑在这种情况下文档是错误的?请参阅:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
2021-05-14 05:36:35

一切都只是滴答声,无需记住方法......

var aMinuteAgo = new Date( Date.now() - 1000 * 60 );

或者

var aMinuteLess = new Date( someDate.getTime() - 1000 * 60 );

更新

在使用过 momentjs 之后,我不得不说这是一个很棒的库,你应该去看看。确实,在许多情况下,滴答会工作使您的代码非常小,并且您应该尝试使代码尽可能小,以满足您的需要。但是对于任何复杂的事情,请使用 momentjs。

IMO 这不是那么简单。解密这段代码的实际作用需要一些努力。更好的方法是将这种逻辑包装在一个函数中。
2021-04-21 05:36:35

moment.js有一些非常方便的方法来操作日期对象

.subtract方法,允许用户从一个日期减去一定量的时间单位,通过提供量和TIMEUNIT字符串。

var now = new Date();
// Sun Jan 22 2017 17:12:18 GMT+0200 ...
var olderDate = moment(now).subtract(3, 'minutes').toDate();
// Sun Jan 22 2017 17:09:18 GMT+0200 ...

Luxon也有一个 API 来操作它自己的DateTime对象

var dt = DateTime.now(); 
// "1982-05-25T00:00:00.000Z"
dt.minus({ minutes: 3 });
dt.toISO();              
// "1982-05-24T23:57:00.000Z"

这是我发现的:

//First, start with a particular time
var date = new Date();

//Add two hours
var dd = date.setHours(date.getHours() + 2);

//Go back 3 days
var dd = date.setDate(date.getDate() - 3);

//One minute ago...
var dd = date.setMinutes(date.getMinutes() - 1);

//Display the date:
var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var date = new Date(dd);
var day = date.getDate();
var monthIndex = date.getMonth();
var year = date.getFullYear();
var displayDate = monthNames[monthIndex] + ' ' + day + ', ' + year;
alert('Date is now: ' + displayDate);

资料来源:

http://www.javascriptcookbook.com/article/Perform-date-manipulations-based-on-adding-or-subtracting-time/

https://stackoverflow.com/a/12798270/1873386