You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:45:04