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


133

我如何将这些伪代码转换为可工作的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 - durationInMuntes;

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

Answers:


199

一旦知道这一点:

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

...并不难。

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

var MS_PER_MINUTE = 60000;
var myStartDate = new Date(myEndDateTime - durationInMinutes * MS_PER_MINUTE);

6
但是,当您添加分钟数时却无法处理。要在添加分钟时正确处理,应使用.getTime()。示例:var myStartDate = new Date(myEndDateTime.getTime() + durationInMinutes * MS_PER_MINUTE);
加布里埃尔·奥利维拉

您还可以使用 var myStartDate = somedate.addMinutes(-durationInMuntes);我假设somedate是Date对象的方式
kubahaha

1
它的工作原理...但有一个问题,Date()构造函数有3个选项,即1:空2:字符串和3:数字年份,数字月份....因此上面使用的那个跟随哪个构造函数?
Zafar


有关如何为例这可以出错,使用欧洲/伦敦的时区的区域设置:var d = new Date("2017-10-29 01:50:00"), e = new Date(d.getTime() + 20 * 60000);你所期望的e02:10:00,对不对?不。01:10:00。DST打声招呼。然后是s秒...
Niet the Dark Absol

81

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

var endDate = somedate;

var startdate = new Date(endDate);

var durationInMinutes = 20;

startdate.setMinutes(endDate.getMinutes() - durationInMinutes);

52
值得注意的是,setMinutes()它足够聪明,可以正确处理负面的分钟。因此,如果开始日期为3:05,并且您想减去30分钟,则将传递-25给setMinutes(),它足够聪明,可以知道3:-25is 2:35。(即它不会引发异常。)
Kip

2
@Kip-谢谢,这就是使此答案值得的见识。但是所有浏览器都能保证吗?我问是因为MDN表示只允许0-59,但是我怀疑在这种情况下文档是错误的吗?请参阅:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
贾斯汀·西尔

这对我来说更有用,我想从通过构造函数以特定方式设置的现有Date对象实例中减去时间。谢谢!
Bill Effin Murray 2012年

1
只要记住,.setMinutes(...)强制处理int值即可。如果您将其设置1.5 minutes为,Date则只会设置1 minute并保持秒数与以前相同。
加布里埃尔·奥利维拉

当我尝试startDate = endDate时,在类似的用例中我得到了错误的值。看起来像是发生浅拷贝的问题
raghav710

35

一切都只是勾号,不需要记住方法 ...

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

要么

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

更新

在使用momentjs之后,我不得不说这是一个很棒的库,您应该检查一下。的确,滴答声在许多情况下都可以使您的代码变得非常小,并且您应该根据需要执行的操作使代码尽可能小。但是对于任何复杂的事情,请使用momentjs。


2
IMO这不是那么简单。解密此代码实际需要花费一些精力。更好的方法是将这种逻辑包装在函数中。
sszarek

12

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 ...

6

这是我发现的:

//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


5
var date=new Date();

//here I am using "-30" to subtract 30 minutes from the current time.
var minute=date.setMinutes(date.getMinutes()-30); 

console.log(minute) //it will print the time and date according to the above condition in Unix-timestamp format.

您可以使用。new Date()例如将Unix时间戳转换为常规时间。

var extract=new Date(minute)
console.log(minute)//this will print the time in the readable format.

我进行了一些格式更改。请确保它仍然反映您打算发布的内容。
adiga

1

尝试如下:

var dt = new Date();
dt.setMinutes( dt.getMinutes() - 20 );
console.log('#####',dt);

0

这就是我所做的:在Codepen上查看

var somedate = 1473888180593;
var myStartDate;
//var myStartDate = somedate - durationInMuntes;

myStartDate = new Date(dateAfterSubtracted('minutes', 100));

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

function dateAfterSubtracted(range, amount){
    var now = new Date();
    if(range === 'years'){
        return now.setDate(now.getYear() - amount);
    }
    if(range === 'months'){
        return now.setDate(now.getMonth() - amount);
    }
    if(range === 'days'){
        return now.setDate(now.getDate() - amount);
    }
    if(range === 'hours'){
        return now.setDate(now.getHours() - amount);
    }
    if(range === 'minutes'){
        return now.setDate(now.getMinutes() - amount);
    }
    else {
        return null;
    }
}

OP不使用new Date(),但是有一些指定的日期,并且仅询问有关减去分钟的信息。另外,您的代码不起作用-它返回UNIX时间戳而不是Date对象。
米哈尔Perłakowski

0

使用此功能扩展Date类

// Add (or substract if value is negative) the value, expresed in timeUnit
// to the date and return the new date.
Date.dateAdd = function(currentDate, value, timeUnit) {

    timeUnit = timeUnit.toLowerCase();
    var multiplyBy = { w:604800000,
                     d:86400000,
                     h:3600000,
                     m:60000,
                     s:1000 };
    var updatedDate = new Date(currentDate.getTime() + multiplyBy[timeUnit] * value);

    return updatedDate;
};

因此,您可以在任意日期中添加或减去许多分钟,秒,小时,天...。

add_10_minutes_to_current_date = Date.dateAdd( Date(), 10, "m");
subs_1_hour_to_a_date = Date.dateAdd( date_value, -1, "h");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.