如何在JavaScript日期中添加分钟、小时或天数?
在Web开发中,你很难避免遇到需要操作日期的情况。也许你需要显示一个交付日期或截止日期。尽管听起来很简单,但JavaScript并没有提供一个特别友好的API来处理这些任务。但是,只要稍加巧妙,这些问题都能迎刃而解。
[!NOTE]
你可能不熟悉JavaScript的数字分隔符,它在下面的示例中使用。它们是使大型数字值更易读的语法糖。
添加秒到日期
Date
对象内置了Date.prototype.getTime()
和Date.prototype.setTime()
方法。这两个方法允许我们获取日期对象的当前时间和设置日期对象的时间。
所有的值都是以毫秒为单位的,所以在设置时间之前,我们需要将秒数乘以1000
。然而,请注意设置时间会改变对象,所以我们还需要创建一个新的Date
对象,以避免改变原始对象。
const addSecondsToDate = (date, n) => {
const d = new Date(date);
d.setTime(d.getTime() + n * 1000);
return d;
};
addSecondsToDate(new Date('2020-10-19 12:00:00'), 10);
// 2020-10-19 12:00:10
addSecondsToDate(new Date('2020-10-19 12:00:00'), -10);
// 2020-10-19 11:59:50
添加分钟到日期
与秒类似,我们可以在设置时间之前将分钟数乘以一分钟的毫秒数(1000 * 60
)来添加分钟到日期。
const addMinutesToDate = (date, n) => {
const d = new Date(date);
d.setTime(d.getTime() + n * 60_000);
return d;
};
addMinutesToDate('2020-10-19 12:00:00', 10);
// 2020-10-19 12:10:00
addMinutesToDate('2020-10-19 12:00:00', -10);
// 2020-10-19 11:50:00
添加小时到日期
要添加小时到日期,我们可以在设置时间之前将一个小时的毫秒数(1000 * 60 * 60
)乘以数量。
const addHoursToDate = (date, n) => {
const d = new Date(date);
d.setTime(d.getTime() + n * 3_600_000);
return d;
};
addHoursToDate('2020-10-19 12:00:00', 10);
// 2020-10-19 22:00:00
addHoursToDate('2020-10-19 12:00:00', -10);
// 2020-10-19 02:00:00
添加天到日期
对于较大的值,如天数,我们可以使用Date.prototype.getDate()
和Date.prototype.setDate()
。
const addDaysToDate = (date, n) => {
const d = new Date(date);
d.setDate(d.getDate() + n);
return d;
};
addDaysToDate('2020-10-15', 10);
// 2020-10-25
addDaysToDate('2020-10-15', -10);
// 2020-10-05
添加工作日到日期
工作日的计算稍微复杂一些。我们将使用之前的代码片段来添加所需的天数。
在这之前,我们将使用Math.sign()
来确定我们应该添加(+1
)还是减去(-1
)天数。然后,我们将使用Array.from()
来创建一个长度等于n
的数组,绝对值为n
。
最后,我们将使用Array.prototype.reduce()
来迭代数组,从date
开始递增,使用addDaysToDate()
。如果某一天不是工作日,我们将根据需要添加或减去另一天,直到找到一个工作日。
const isWeekday = date => date.getDay() % 6 !== 0;
const addWeekDays = (date, n) => {
const s = Math.sign(n);
const d = new Date(date);
return Array.from({ length: Math.abs(n) }).reduce((currentDate) => {
currentDate = addDaysToDate(currentDate, s);
while (!isWeekday(currentDate))
currentDate = addDaysToDate(currentDate, s);
return currentDate;
}, d);
};
addWeekDays('2020-10-05', 5);
// 2020-10-12
addWeekDays('2020-10-05', -5);
// 2020-09-28
[!WARNING]
上述代码片段可能不适用于实际场景,因为它没有考虑官方假期。如果您计划在生产中使用它,建议调整工作日检查,以包括已知假期的列表。