javascript - 时差计算错误

标签 javascript date

function parseDate(s){
    var parts = s.split('/')
    return new Date(parts[2], parts[1], parts[0])
}

function calcDaysBetween(startDate, endDate){
    return Math.floor((endDate-startDate)/86400000);
}

function yarro(){
    var startDate = parseDate($('#pickupdate').val());
    var endDate = parseDate($('#dropoffdate').val());
    var days = calcDaysBetween(startDate, endDate);
    $('#newp').html('Days Count: <b>'+days);
}

31/3/2012 , 1/4/2012
Days Count: 0 //wrong

31/1/2012 , 1/2/2012
Days Count: -1 //wrong


1/1/2012 , 2/1/2012
Days Count: 1 //ok

为什么?

最佳答案

知道 JS 月份是从 0 开始的,对此非常重要。您的代码将日期 2012 年 1 月 31 日解析为 2012 年 二月 31 日,这在技术上是无效日期,但被解释为 2012 年 3 月 2 日(第二日,因为 2012 年是闰年)。您需要做的是从 parts[1] 值中减去 1,然后再将其传递给 Date 构造函数。

您在 31/1/2012 和 1/2/2012 之间得到 -1 天,因为这些日期被解释为 2012 年 2 月 31 日(2012 年 3 月 2 日)和 2012 年 3 月 1 日。当您减去这些日期时,您会得到 - 1 天的差异。

您在 31/3/2012 和 1/4/2012 之间得到 0 天,因为这些日期被解释为 2012 年 4 月 31 日(2012 年 5 月 1 日)和 2012 年 5 月 1 日,这是同一日期,导致 0-日差。

您在 1/1/2012 和 2/1/2012 之间得到 1 天,因为这些日期被解释为 2012 年 2 月 1 日和 2012 年 2 月 2 日,导致 1 天的差异。

关于javascript - 时差计算错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8749790/

相关文章:

javascript - 简单立方体-三个JS

php - 如何确定日期是否在 PHP 中的两个日期之间?

php - 根据当前日期和表日期删除mysql表行

javascript正则表达式不包含中间的单词

javascript - 如何在清除输入字段时触发 JavaScript 事件?

javascript - 如何在html/css/javascript中动态创建两行正方形

php - 如何轻松确定生日的年龄? (php)

Javascript Date 对象奇怪的行为/错误?

sql - 如何使用 SQL Server 选择日期时间日期为 dddd、dd mmmm、yyyy?

javascript - redux-thunk:暂停组件执行直到 Action Creator 完成