【问题标题】:Wrong date difference calculated using momentjs使用 momentjs 计算错误的日期差异
【发布时间】:2018-10-11 16:13:18
【问题描述】:

我正在尝试使用moment js 计算两个日期之间的天数。

function (value) {
    var expiration= moment(value).format('DDMMYYYY');
    var today = moment().format('DDMMYYYY');
    var dayToExpiration = moment(expiration- today).format('D[days] ,H[hours]');

    console.log(today + " : " + expiration
    console.log(dayToExpiration);

结果是:

 11102018 : 28102020  //--> 11.10.2018 : 28.10.2018
 1 days ,6 hours //why only one day??

【问题讨论】:

    标签: momentjs


    【解决方案1】:

    因为您的 dayToExpiration 变量应该是 moment.Duration 对象,而不是字符串。

    两个日期时间之间的差异是持续时间,而不是日期时间。

    【讨论】:

    • dayToExpiration 是 OP 代码示例中的字符串,而不是时刻对象。我同意你的观点,两个日期时间之间的差异应该是一个持续时间。 OP 可以使用您的(精彩的)moment-duration-format 插件获得所需的输出。
    • 糟糕,感谢@VincenzoC 的更正和客气话!
    【解决方案2】:

    简答:

    正如 John Madhavan-Reese 在他的回答中所说,您必须使用时刻 Duration 来表示两个时刻之间的差异。

    代码示例中的问题:

    在您的代码中,您正在根据expiration 和today 之间的差异创建一个矩对象。该值被 moment 解释为 自 Unix 纪元以来的毫秒数(请参阅 moment(Number)),因此您正在为 1970 年 1 月 1 日左右的随机一天创建一个 moment 对象(请参阅moment(expiration- today).format())。 format() 中的 D 标记代表月份中的某天,因此它会给出 “不正确” 输出。

    我建议的解决方案:

    您可以使用momentjs 的diff() 计算差异,然后您可以使用moment.duration(Number) 创建一个持续时间。

    最后,您可以使用moment-duration-format 插件(作者:John Madhavan-Reese :D)获得所需的输出

    这是一个现场样本:

    function getDiff(value) {
         var expiration= moment(value); // Parse input as momement object
         var today = moment(); // get now value (includes current time)
         // Calculate diff, create a duration and format it
         var dayToExpiration = moment.duration(Math.abs(today.diff(expiration))).format('D[days], H[hours]');
    
         console.log(today.format('DDMMYYYY') + " : " + expiration.format('DDMMYYYY'));
         console.log(dayToExpiration);
    }
    
    getDiff('2018-10-28');
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment-duration-format/2.2.2/moment-duration-format.min.js"></script>

    【讨论】:

    • 亲爱的读者,如果你想使用这个解决方案,你需要安装moment-duration-format作为依赖,否则你会收到一个TypeError!
    【解决方案3】:

    我遇到了错误。这个对我有用:

    moment.duration(expiration.diff(today))._milliseconds / (1000*60*60*24));
    

    【讨论】:

    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多