当前位置: 首页 > Web前端 > JavaScript

矩的diff法,两个日期的正负比较值居然不同?看了算法原理,原来是我太幼稚了

时间:2023-03-27 16:11:38 JavaScript

问题大家好,我是DataRios。今天有一段业务逻辑需要判断选择的时间范围不能超过3个月。这种套路比较用了moment.js的diff方法是不是好用?moment('2020-3-30').diff(moment('2020-7-01'),'months')控制台看看结果:-3.03333333333333,还不错,才3个多月,stable~这个是负的有点难受,改一下起止时间moment('2020-7-01').diff(moment('2020-3-30'),'months')靠,这个console来了出来一看:3.064516129032258,嗯,正负相差很正常,为什么后面的小数点相差这么大?Moment是白痴吗?不,我一定是个白痴。...如果您有疑问,请先阅读文档:diff()|Moment.js文档(momentjs.cn)emmm,好像没什么特别的,但是有一行小词吸引了我:Seemorediscussiononthemonthandyeardiffshere看来这里确实有Beef。就算解决不了,我也进去投诉一下。哈哈,我的问题和我的问题不能说是表面上的相似。??我为什么这么说自己)让我看看下面的大师们是如何教他做人的。..翻到最下面,这位Gibson兄发了一个链接:differenceshouldalwaysreturna"top-heavybalanced"durationwithlargest-firstorderofoperations·Issue#993·tc39/proposal-temporal(github.com)这里有一个其中的评论说:Java使用的算法似乎是这样的:从较小的值开始:2020-01-31Find在不超过2020-03-30的情况下可以添加到它的整月数。那是一个月。在2020-01-31上加一个月,并将该结果限制为有效日期,例如2020-02-29现在求在不超过末尾的情况下可以添加的整天数。也就是30天。返回P1M30D看完这一段,我豁然开朗。以我们今天遇到的实际案例来说说他解释的原理是如何实现的:diff算法就是每个整月进行加减,直到不能减为止。然后查看剩余天数与当月相比的百分比。比如07-01是从零点算起,负3个月就是04-01的零点,还有3-31和3-30还有两天到3-30的零点,就有三月份有31天,所以是2/31=0.0645,总和是3.064516129032258。7-01零点前还有一整天,6月有30天,所以小数为1/30=0.333333333...,和为-3.03333333333333...结论因此,diffmoment.js的方法在比较日/月/年等特殊粒度的单位时,会先按照整粒度进行扣除,剩下的小数部分按照子级别的粒度取。/Month/Day是按照比例来计算的,这也是为什么A到B的值和B到A的值不同的原因。虽然一般来说,多了或者少了都不会影响值。毕竟我们是按照自己规定的粒度来比较的,但是这种原理是完全可以理解的,也是一种“学习”的收获。大家好,我是数据里奥斯~