如何在Moment.js中将一天的起止时间设置为指定时刻
Moment.js 没有内置自定义日起止时间的配置项,你可以通过封装工具函数的方式实现需求,以下是可直接运行的实现方案:
实现思路
你需要的是按「每日8点到次日7:59:59为一个自然日周期」的规则计算时间,核心逻辑为:
- 若当前时间小于当日8点,该时间归属于前一天的周期
- 若当前时间大于等于当日8点,该时间归属于当天的周期
代码实现
通用工具函数
/** * 获取自定义日起始时间 * @param {moment} momentObj 待处理的moment对象 * @param {number} offsetHour 自定义的日起始小时,默认值8 * @returns {moment} 计算后的起始时间moment对象 */ function getCustomStartOfDay(momentObj, offsetHour = 8) { const temp = momentObj.clone(); const currentHour = temp.hour(); // 当前时间早于起始小时,归为前一天的周期 if (currentHour < offsetHour) { temp.subtract(1, 'day'); } return temp.hour(offsetHour).minute(0).second(0).millisecond(0); } /** * 获取自定义日结束时间 * @param {moment} momentObj 待处理的moment对象 * @param {number} offsetHour 自定义的日起始小时,默认值8 * @returns {moment} 计算后的结束时间moment对象 */ function getCustomEndOfDay(momentObj, offsetHour = 8) { const temp = momentObj.clone(); const currentHour = temp.hour(); // 当前时间晚于等于起始小时,结束时间为次日的[offsetHour-1]点59分59秒 if (currentHour >= offsetHour) { temp.add(1, 'day'); } return temp.hour(offsetHour - 1).minute(59).second(59).millisecond(999); }
使用示例
// 示例1:当前时间为2021-10-07 09:30:00(大于等于8点,归为10月7日周期) const time1 = moment('2021-10-07 09:30:00'); console.log(getCustomStartOfDay(time1).toString()) // 输出:Thu Oct 07 2021 08:00:00 GMT+0530 console.log(getCustomEndOfDay(time1).toString()) // 输出:Fri Oct 08 2021 07:59:59 GMT+0530 // 示例2:当前时间为2021-10-07 06:30:00(小于8点,归为10月6日周期) const time2 = moment('2021-10-07 06:30:00'); console.log(getCustomStartOfDay(time2).toString()) // 输出:Wed Oct 06 2021 08:00:00 GMT+0530 console.log(getCustomEndOfDay(time2).toString()) // 输出:Thu Oct 07 2021 07:59:59 GMT+0530
全局挂载用法
如果需要全局统一使用该规则,可直接将方法挂载到moment原型上,和原生startOf/endOf用法一致:
moment.fn.customStartOfDay = function (offsetHour = 8) { const currentHour = this.hour(); if (currentHour < offsetHour) { this.subtract(1, 'day'); } return this.hour(offsetHour).minute(0).second(0).millisecond(0); } moment.fn.customEndOfDay = function (offsetHour = 8) { const currentHour = this.hour(); if (currentHour >= offsetHour) { this.add(1, 'day'); } return this.hour(offsetHour - 1).minute(59).second(59).millisecond(999); } // 调用方式 const now = moment(); console.log(now.customStartOfDay().toString()); console.log(now.customEndOfDay().toString());
内容的提问来源于stack exchange,提问作者Manjeet Singh
相关产品推荐
相关产品推荐

