Moment JS 日期差异为月份

Moment JS Date Difference as Month

我正在尝试获取当前当地时间与 2021 年 12 月 1 日下午 4 点之间的时差。相差 6 个月零 2 小时。在这种情况下,我希望答案类似于 6.02。但是5.98来了。我怎样才能得到我想要的答案?

enter image description here

根据 moment.js docs,在您的示例中获取两个日期之间的差异的标准方法是 now.diff(date, 'months', true),这应该 return 一个大于 6 的浮点数。

now.diff(date) returns 这两个时间点之间的毫秒差。调用 moment.duration({milliseconds}).asMonths() 并不理想,因为某些月份可能有 30 天,而其他月份可能有 31 天。 moment.js 似乎使用 30 到 31 天之间的某个时间作为一个月的持续时间。为了解决这个问题,moment.js 在文档中讨论了日历差异:

moment#diff has some special handling for month and year diffs. It is optimized to ensure that two months with the same date are always a whole number apart.

So Jan 15 to Feb 15 should be exactly 1 month.

Feb 28 to Mar 28 should be exactly 1 month.

Feb 28 2011 to Feb 28 2012 should be exactly 1 year.

“一个月”的定义只能是“模糊”的,因为日历上的月份长短不一。定义它的一种方法是将年份分成 12 个相等的部分并将其用作 "month-metric":

function monthsUntil(year,month,day,hour=0){
 const trg=new Date(year,month-1,day,hour,0,0), 
  now=new Date(), nxt=new Date();
 nxt.setFullYear(nxt.getFullYear()+1);
 return (12*(trg-now)/(nxt-now)).toFixed(4);
}

console.log(monthsUntil(2022,12,1,16))