首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Moment JS diff()返回10月31日到11月1日之间的0天

Moment JS diff()返回10月31日到11月1日之间的0天
EN

Stack Overflow用户
提问于 2021-11-01 13:07:17
回答 1查看 63关注 0票数 1

如下所示,moment.diff()错误地计算了昨天(10月31日)和今天(11月1日)之间的0天数。这是momentJS还是NodeJS (v14.15.4)的问题?

代码语言:javascript
运行
复制
> a = moment(new Date('2021-10-31'))
Moment<2021-10-31T02:00:00+02:00>
> b = moment(new Date('2021-11-01'))
Moment<2021-11-01T01:00:00+01:00>
> a.diff(b, 'days')
0
> a.diff(b, 'hours')
-24

一个可能的原因可能是从10月31日到11月1日*官方发生的夏季=>冬季变化。从“2021-10-31”到夏季时间Moment<2021-10-31T02:00:00+02:00> (2h)的解析可以明显看出这一点。

然而,我认为24小时的差异不应该是0天,因此它是一个瞬间的bug。

*虽然每个人实际上都把他们的时钟拨回了10月31日星期天...去想一想。

EN

回答 1

Stack Overflow用户

发布于 2021-11-04 09:28:23

我认为这是因为小时发生了变化,而在.diff()中,对于get小时,它返回一个小于1的数字,而moment则将其舍入为0。

您可以在moment声明中不带use Date的情况下更改代码:

代码语言:javascript
运行
复制
const a = moment('2021-10-31');
const b = moment('2021-11-01');

console.log(a.diff(b, 'days')); // -1
console.log(a.diff(b, 'hours')); // -25 <- but this is wrong
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

或者你也可以强制.diff()函数返回一个浮点型而不是整型来放入第三个参数,然后像这样进行舍入:

代码语言:javascript
运行
复制
const a = moment(new Date('2021-10-31'));
const b = moment(new Date('2021-11-01'));

console.log(Math.round(a.diff(b, 'days', true)));
console.log(Math.round(a.diff(b, 'hours', true)));
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

否则就是强制moment使用utc日期:

代码语言:javascript
运行
复制
const a = moment.utc(new Date('2021-10-31'));
const b = moment.utc(new Date('2021-11-01'));

console.log(a.diff(b, 'days'));
console.log(a.diff(b, 'hours'));
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69797377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档