【问题标题】:Javascript days between 2 dates return wrong两个日期之间的 Javascript 天数返回错误
【发布时间】:2016-02-05 01:45:12
【问题描述】:

一直试图解决这个问题,但没有成功,我在这里找到了几个类似的答案,但格式在这里很重要。我需要返回 X 年 X 月 X 天。

你能不能看看,我这里做错了什么……天数不太对。

这是bin

function inBetweenDays(y,m,d){

var user_date = new Date(y,m + 1,d);
var today_date = new Date();

  
var diff_date = (user_date - today_date);

var num_years = diff_date/31536000000;
var num_months = (diff_date % 31536000000)/2628000000;
var num_days =  ((diff_date % 31536000000) % 2628000000)/86400000;
 
var years = Math.floor(Math.abs(num_years));
var months = Math.floor(Math.abs(num_months));  
var days =  Math.floor(Math.abs(num_days));
  
  if (years >= 1) {
    console.log(years + " years " + months + " months " + days + " days");
  } else if (years <= 0 && months >= 0){
     console.log(months + " months " + days + " days");
   } else {
     console.log(days + " days ");
   }
  
  }
  

inBetweenDays(2015,03,04);
inBetweenDays(2016,03,04);
inBetweenDays(2016,02,04);
inBetweenDays(2018,02,04);

【问题讨论】:

  • 第三行不应该是new Date(y,m - 1,d)吗?
  • 假设一天是86400000 毫秒长,你已经错了。请去研究为什么。
  • @Nayuki...我认为应该是 m + 1,因为月份是从 0 开始的.....
  • 您是否在寻找两个日期之间的 日历 差异?如果您希望 3 月 1 日为 2 个月,即 1 月 1 日之后的 0 天,无论闰年如何,都很难使用两个日期之间的毫秒来得出答案。
  • 对于超过几个月的时间段,您的结果几乎肯定是错误的,因为天、月和年的长度各不相同。您确定这不是 Return Date in format ( x years, x months, x days) 的副本(它本身就是副本)吗?您可能应该将 today_date 的小时数归零。

标签: javascript date math


【解决方案1】:

以年、月、日为单位计算两个日期之间的日历日期差的算法如下:

  1. 验证日期是否包含完整的年份(4 位数字)、1-12 范围内的月份和 1-1 月份的月份日期。

  2. 从较晚的日期天数中减去较早的日期天数。如果需要借用,则将较早日期的月份,较早日期的年份中的天数添加到较晚日期的天数,并在要减去的月份中加 1。

  3. 从较晚日期月份中减去较早日期月份。如果需要借用,请在以后的月份加上 12,并在要减去的年份加上 1。

  4. 从较晚日期年份中减去较早日期年份。

这可能已在一系列重复问题中对该问题的一个现有答案中实现,但在没有算法文档的情况下尝试发现它。借款天数的计算方法如下:

function monthDays(y, m)    // full year and month in range 1-12
{   var leap = 0;
    if( m == 2)
    {   if( y % 4 == 0) leap = 1;
        if( y % 100 == 0) leap = 0;
        if( y % 400 == 0) leap = 1;
    }
    return [0, 31,28,31,30,31,30,31,31,30,31,30,31][ m] + leap;
}

(编辑)或者根据评论,使用 Date 对象的行为来调整超出预期的绑定行为:

function monthDays( y, m)
{ return new Date(y, m, 0).getDate();
}

【讨论】:

  • 如果 m 是日历月数,则 new Date(y, m, 0).getDate() 返回该月的天数,并且要键入的天数更少。 ;-)
  • @RobG 我喜欢它。我想向新手解释一下吗? ;-)
  • 使用日历月数将日期设置为下个月(因为 ECMAScript 月份是从 0 开始的),但是将日期设置为零会创建上个月最后一天的日期,所以回到您想要的月份,例如new Date(2016,1,0) 为 2016-01-31 创建一个日期。
【解决方案2】:

HTML

<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>

JavaScript

function parseDate(str) {
    var mdy = str.split('/')
    return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

function daydiff(first, second) {
    return Math.round((second-first)/(1000*60*60*24));
}

来源: How do I get the number of days between two dates in JavaScript?

【讨论】:

    【解决方案3】:
    function days_between(date1, date2) {
    
        // The number of milliseconds in one day
        var ONE_DAY = 1000 * 60 * 60 * 24;
    
        // Convert both dates to milliseconds
        var date1_ms = date1.getTime();
        var date2_ms = date2.getTime();
    
        // Calculate the difference in milliseconds
        var difference_ms = Math.abs(date1_ms - date2_ms);
    
        // Convert back to days and return
        return Math.round(difference_ms / ONE_DAY);
    }
    

    【讨论】:

    • Math.round((date1 - date2) / 8.64e7)。为什么不保留标志?
    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多