/**
* 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) {
var ret = new Date(date); //don't change original date
var checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);};
switch(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;
}
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)
1
这是 ES6 版本:
let getTimeAfter30Mins = () => {
let timeAfter30Mins = new Date();
timeAfter30Mins = new Date(timeAfter30Mins.setMinutes(timeAfter30Mins.getMinutes() + 30));
};
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
<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>
13 回答
使用库
如果您正在进行大量的日期工作,您可能需要查看JavaScript日期库,如Datejs或Moment.js . 例如,使用Moment.js,这只是:
香草Javascript
这就像chaos's answer,但是在一行中:
diff
在oldDateObj
时间内您想要的分钟数差异 . 它甚至可能是消极的 .或者作为可重用的函数,如果您需要在多个位置执行此操作:
小心使用Vanilla Javascript . 日期很难!
您可能认为可以在24小时内添加日期以获取明天的日期,对吗?错误!
事实证明,如果用户观察夏令时,则一天不一定是24小时 . 一年中有一天只有23小时,一年中有一天长达25小时 . 例如,在美国和加拿大的大部分地区,2014年11月2日午夜后24小时仍然是11月2日:
这就是为什么 using one of the afore-mentioned libraries is a safer bet 如果你必须做很多工作 .
下面是我写的这个函数的更通用的版本 . 我仍然建议使用一个库,但这对你的项目来说可能是过度/不可能的 . 语法在MySQL DATE_ADD函数之后建模 .
Working jsFiddle demo .
也许是这样的?
我总是创建7个函数,在JS中使用日期:addSeconds,addMinutes,addHours,addDays,addWeeks,addMonths,addYears .
你可以在这里看到一个例子:http://jsfiddle.net/tiagoajacobi/YHA8x/
如何使用:
这是功能:
这就是我所做的,它看起来效果很好:
然后你可以像这样调用它:
最简单的解决方法是识别javascript日期只是数字 . 它开始
0
或'Wed Dec 31 1969 18:00:00 GMT-0600 (CST)
. 每个1
代表一毫秒 . 您可以通过获取值并使用该值实例化新日期来添加或减去毫秒数 . 你可以用这种思维轻松管理它 .这是 ES6 版本:
称之为:
我觉得这里的许多答案都缺乏创意组件,非常需要时间旅行计算 . 我提出了30分钟的时间翻译解决方案 .
(jsfiddle here)
只是另一种选择,我写道:
DP_DateExtensions Library
如果这是您需要的所有日期处理,那就太过分了,但它会做您想做的事情 .
支持日期/时间格式,日期数学(加/减日期部分),日期比较,日期解析等 . 它是自由开源的 .
像我一样懒惰:
Kip在coffeescript中的答案(从上面开始),使用“enum”,并在同一个对象上操作:
使用已知的现有库来处理处理时间计算所涉及的怪癖 . 我目前最喜欢的是moment.js .