Moment.js中如何把一个日期的时间部分赋值到另一日期上
问题核心原因
你最初的写法失效的核心是 format() 方法返回的是字符串类型,不是Moment实例,后续链式调用的.day()方法根本无法执行,自然不会生效。
你目前分字段设置时分秒的实现可以正常运行,有以下更精简的优化方案:
优化方案
优化逻辑主要是减少不必要的类型转换,复用Moment内置方法简化代码:
_calculateDate = () => { const { time, day } = this.state; // 直接生成目标星期的futureDate Moment实例,无需转Date const futureDate = moment(new Date(time), "HH:mm").day(day); const today = moment(); // 判断是否需要加一周 const targetBase = futureDate.isAfter(today) ? today : today.clone().add(1, 'weeks'); // 批量设置时间和星期,直接输出时间戳 return targetBase .set({ hour: futureDate.hour(), minute: futureDate.minute(), second: futureDate.second(), }) .day(day) .format("x"); };
优化点说明
- 全程使用Moment实例操作,避免多次在Date和Moment之间互转,减少性能损耗和可能的时区异常
- 用
set()方法批量设置时分秒字段,无需单独声明三个变量存储时间值,代码更简洁 - 复用基础日期逻辑,避免if/else分支里重复写相同的时间设置代码,后续修改维护成本更低
- 用Moment内置的
isAfter方法做时间对比,语义更清晰
内容的提问来源于stack exchange,提问作者FrontEnd Expert
相关产品推荐
相关产品推荐

