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

Moment.js中判断当前时间是否晚于一分钟后返回false的问题

为什么moment.js中一分钟后判断now.isAfter(oneMinuteLater, 'minute')返回false?

先看你贴的代码:

const created = moment(new Date());
const oneMinuteLater = created.add(1, 'minutes');
setTimeout(() => {
  const now = moment();
  // 返回false
  console.log('oneMinutePass', now.isAfter(oneMinuteLater, 'minute'));
}, 60000);

问题根源:moment的add方法是可变操作

我之前也踩过这个坑!moment.js里的add方法是会直接修改调用它的原对象的,而不是返回一个全新的moment实例。也就是说,当你执行created.add(1, 'minutes')时,created本身已经被改成了「初始时间+1分钟」的时间点,oneMinuteLater只是指向了同一个对象的引用,根本不是独立的时间节点。

等60秒后执行setTimeout回调时:

  • now是当前时间,也就是「初始时间+60秒」
  • oneMinuteLater其实和created完全一样,都是「初始时间+1分钟」
  • 用'minute'精度调用isAfter时,moment会比较到分钟级别——这两个时间其实都落在同一个分钟区间里(比如初始时间是10:00:00,now是10:01:00,oneMinuteLater也是10:01:00),所以now.isAfter(...)会返回false(同一分钟内不算「之后」)。

解决方法

1. 使用clone()创建副本后再修改

在调用add之前,先克隆原moment对象,这样原对象不会被修改:

const created = moment(new Date());
const oneMinuteLater = created.clone().add(1, 'minutes'); // 先克隆再add
setTimeout(() => {
  const now = moment();
  console.log('oneMinutePass', now.isAfter(oneMinuteLater, 'minute')); // 会返回true
}, 60000);

2. 直接用moment构造函数创建新实例

也可以直接把created传入moment构造函数,生成新对象后再add:

const created = moment(new Date());
const oneMinuteLater = moment(created).add(1, 'minutes');
setTimeout(() => {
  const now = moment();
  console.log('oneMinutePass', now.isAfter(oneMinuteLater, 'minute')); // 返回true
}, 60000);

3. 改用diff方法判断(更直观)

如果只是想判断是否超过一分钟,用diff方法直接计算时间差可能更清晰:

const created = moment(new Date());
setTimeout(() => {
  const now = moment();
  console.log('oneMinutePass', now.diff(created, 'minutes') >= 1); // 返回true
}, 60000);

内容的提问来源于stack exchange,提问作者undefined

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:15:14