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
相关产品推荐
相关产品推荐

