2016-02-05 58 views
2

一直试图解决这个问题一段时间没有成功,我在这里找到了几个类似的答案,但是这里的格式是重要的。我需要返回X年,X月,X天。2天之间的Javascript日期返回错误

你可以看看,我在这里做错了什么......天数不太对。

这里是一个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);

+1

不应该第三行是'new Date(y,m - 1,d)'而不是? – Nayuki

+0

假设一天的时间长度为86400000毫秒,你就错了。请去研究为什么。 – CBroe

+0

@Nayuki ...我认为它应该是m + 1,因为月份是以0为基础..... – Lucky500

回答

0

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?

1

的算法来计算以年计算两个日期之间的日历日期的差异,月,日如下:

  1. 验证日期有整年(4位),月份范围为1-12,月份日为范围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; 
} 

(编辑)或备选地作为每个评论,使用日期的对象调整到行为出预期结合行为:

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

如果* m *是日历月份数,那么'new Date(y,m,0).getDate()'返回月份中的天数并且键入的次数更少。 ;-) – RobG

+0

@RobG我喜欢它。我想向新手解释一下吗? ;-) – traktor53

+1

使用日历月份编号将日期设置为下个月(因为ECMAScript月份为0为基础),但将日期设置为零会创建上个月最后一天的日期,因此返回到您想要的月份,例如'新日期(2016,1,0)'创建2016-01-31的日期。 – RobG

0
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); 
} 
+0

或'Math.round((date1 - date2)/ 8.64e7)'。为什么不保留这个标志? – RobG

相关问题