moment.js fromNow() 如果超过 30 天,则减少 1 天

问题描述 投票:0回答:1

我有以下自定义 JavaScript 函数来获取以天/小时/分钟为单位的持续时间 -

daysFromNow(time) {
let oldThreshold = <number>Moment.relativeTimeThreshold('d');

try {
    Moment.relativeTimeThreshold('m', 60);
    Moment.relativeTimeThreshold('h', 24);
    Moment.relativeTimeThreshold('d', 999999);
    return Moment(time).fromNow();
 } finally {
    Moment.relativeTimeThreshold('d', oldThreshold);
 }

}

现在

console.log(daysFromNow('2024-01-11T23:59:59.000+10:30')); // gives 'in 29 days'
console.log(daysFromNow('2024-01-12T23:59:59.000+10:30')); // gives 'in 30 days'
console.log(daysFromNow('2024-01-13T23:59:59.000+10:30')); // gives 'in 30 days', should be 31
console.log(daysFromNow('2024-01-14T15:10:59.000+10:30')) // gives 'in 31 days' - should be 32

不知道我哪里做错了。这与时区有关吗?

javascript momentjs moment-timezone
1个回答
0
投票

对于您的具体情况,我建议使用

startOf()
方法将时间标准化为一天的开始时间,然后比较差异。

function daysFromNow(time) {
  let oldThreshold = moment.relativeTimeThreshold("d");

  try {
    moment.relativeTimeThreshold("m", 60);
    moment.relativeTimeThreshold("h", 24);
    moment.relativeTimeThreshold("d", 999999);

    let currentTime = moment().startOf("day");
    let inputTime = moment(time).startOf("day");
    // ensures that the difference between the two times is calculated in whole days.

    return moment.duration(inputTime.diff(currentTime)).humanize(true);
  } finally {
    moment.relativeTimeThreshold("d", oldThreshold);
  }
}

console.log(daysFromNow("2024-01-11T23:59:59.000+10:30"));
console.log(daysFromNow("2024-01-12T23:59:59.000+10:30"));
console.log(daysFromNow("2024-01-13T23:59:59.000+10:30"));
console.log(daysFromNow("2024-01-14T15:10:59.000+10:30"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js"></script>

© www.soinside.com 2019 - 2024. All rights reserved.