2016-02-05 59 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

相關問題