当前位置: 首页 > 知识库问答 >
问题:

以月为单位的时刻差异,不包括天数

杨星纬
2023-03-14

我试图在不考虑天数的情况下计算出两个日期之间的月份差异。

我试图使用 Math.ceil,但如果 2022 年的一天领先于 2021 年的一天,那么我得到了 2 个月而不是 1 个月的差。

js lang-js prettyprint-override">const diff = moment([2022, 0, 1]).diff(moment([2021, 11, 3]), 'months', true);
console.log(diff); // 0.935483870967742, expected 1

const diffCeil = Math.ceil(
  moment([2022, 0, 3]).diff(moment([2021, 11, 1]), 'months', true)
);
console.log('diffCeil', diffCeil); // 2, expected 1

// Inaccurate diff doesn't work when 2021 day is bigger than in 2022
const inacurrateDiff = moment([2022, 0, 3]).diff(moment([2021, 11, 1]), 'months');
console.log('inacurrateDiff', inacurrateDiff); // 1, as expected
const inacurrateDiff2 = moment([2022, 0, 1]).diff(moment([2021, 11, 3]), 'months');
console.log('inacurrateDiff2', inacurrateDiff2); // 0, expected 1
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.3/moment.min.js"></script>

我确实尝试过使用和不使用 diff 的第三个精确参数。

共有2个答案

赵俊晤
2023-03-14

你得到 2 是因为您使用的是 Math.ceil,它总是将分数值提高到下一个整数。

这里没有一个正确的答案,你必须决定你想计算一个小数月的多少。

例如,如果您只想要整整一个月,请使用 Math.floor 而不是 Math.ceil如果您想将 1.5 个月以内的任何时间计为 1,但将 1.5 个月及以上的任何时间计为 2 个月,请使用 Math.round。或者你可以设置自己的阈值,比如 1.2(工作量要大一些,但不是那么多)。

例子:

function example(date1, date2) {
    const rawDiff = date1.diff(date2, "months", true);
    const diffFloored = Math.floor(rawDiff);
    const diffRounded = Math.round(rawDiff);
    const diffCeiled = Math.ceil(rawDiff);
    const neg = rawDiff < 0;
    const fractional = neg
        ? rawDiff + Math.trunc(rawDiff)
        : rawDiff - Math.trunc(rawDiff);
    const diffOnePointTwo = Math.abs(fractional) > 0.2
        ? Math.ceil(rawDiff)
        : Math.floor(rawDiff);

    console.log({
        date1: date1.toString(),
        date2: date2.toString(),
        rawDiff,
        diffFloored,
        diffRounded,
        diffCeiled,
        diffOnePointTwo,
    });
}

example(
    moment([2022, 0, 1]),
    moment([2021, 11, 3])
);
example(
    moment([2022, 0, 3]),
    moment([2021, 11, 1])
);
example(
    moment([2022, 0, 10]),
    moment([2021, 11, 1])
);
.as-console-wrapper {
    max-height: 100% !important;
}
html prettyprint-override"><script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.3/moment.min.js"></script>
雷方伟
2023-03-14

您可以使用startOf(d,'month')来比较月份的开始:

a.startOf('month').diff(b.startOf('month'), 'month');
 类似资料:
  • 我用moment.js来显示从“今天”到帖子发布的时间,对于任何带有原始国际标准化组织日期的帖子。iso-date”,然后在div中输出帖子的时间量。我有一个工作正常的脚本,但是它只显示“年”,如果帖子是今天,那么它什么也不输出。同样,它只显示前12个月后的几个月和几年,所以1-11个月,然后只显示x年前。 当前输出“3个月前发布”、“一年前发布”、“e年前发布”等 所以我想看到的是类似“刚刚发布

  • 无法计算年、月、日两个日期之间的差异。问题是每个月有30天,每年有365天,没有例外。这里有很多话题,但我没有找到任何能解决我的问题或帮助我解决问题的。我发现的每一个主题都只是用普通的方法解决计算差分的问题,这很简单。我如何计算这种差异? 我使用的是Java 7(没有机会安装joda time)和groovy 2.4.0。 例子有: 谢谢

  • 我在一个XML文件中有格式为(Year.Month.Day)的时间戳。 我需要找出以天为单位的两个时间戳之间的区别。 命名空间“std::chrono”没有成员“year”

  • 问题内容: 我有一个代码,可以使用np.busdaycount计算除周末以外的日期差异,但是我需要在我无法获得的小时数内。 除周末外,我的工作时间为小时。喜欢 问题 Inflow_date_time = 2019-08-01 23:22:46 End_date_time = 2019-08-05 17:43:51预期小时数42小时(1 + 24 + 17) Inflow_date_time = 2

  • 我试图以天计算两个日期之间的差异。然而,当两个日期在不同的月份时,前一个月的日子被丢弃。 例如,如果开始日期是3月31日,结束日期是4月1日,则差异为0。 如果两天在同一个月,它工作正常。 提前感谢您的支持。 更新:我想到了如何修复它。除了选择的日期是一个月的最后一天,一切都按预期进行。可以在下面找到一个实时演示: 这里的演示 例如,开始日期:3月19日,结束日期:3月21日。差2天。 但当选择的

  • 问题内容: 我想要2到2之间的月数,但不计算月份中的天数。所以我只想比较年和月。 例: 我已经使用Joda-time尝试过此操作(返回0,预期为1): 而且,这(使用相同结果)使用Joda-time: 我该怎么做? 问题答案: 您要求的是整个月的数量-这与说“忽略月份中的一天部分”不同。 首先,我建议使用代替进行计算。理想情况下,不要使用任何内容,并从输入内容开始(例如,直接解析文本或输入数据的来

  • 我需要在几天内得到两次约会的差异。 到目前为止,我已经能够得到两个日期之间的区别,但不是在几天内: 有什么想法吗?

  • 所以我在尝试这样做时遇到了一些问题,我已经尝试过使用以下代码: 我有点知道为什么这不是我想要的,因为,我需要的是把我插入数据库的第一个日期,我希望它像(CURRENTDATE-TXTDATE==剩下的日子)