2016-05-09 16 views
3

JavaScriptを使用して年、月、日の年齢を計算します。このコードはいくつかの日付で動作しますが、日付が1年未満であったり、過去にあった場合には機能しません。2つの日付の間の年月日を計算するJavaScript関数

function age(year, month, day) { 

var today = new Date(); 
var endDate = new Date(year, month, day).getTime(); 
var dayDiff = Math.floor((endDate - today)/86400000); 


if (dayDiff >= 365) { 
    var year = Math.floor(dayDiff/365); 
    var remainder = Math.floor(dayDiff) - (year * 365); 
    var months = Math.floor(remainder/30); 
} 

var days = Math.floor(remainder) - (months * 30); 

return year + " years" + " " + months + " months" + " " + days + "  days"; 
} 
console.log(age(2017, 11, 17)); 
console.log(age(2015, 3, 6)); 

答えて

1

日付が全く過去に1年未満の距離またはいつでもある場合しかし、それは動作しません。あなたのコードの条件付きで

ルック:日付が離れて1年未満(365日)であるとき、それは、トリガいない理由を説明するだろう

if (dayDiff >= 365) { 
    ... 
} 

私は、この関数は2つの日付間の年、月と日の「自然」数を取得することをお勧め
0

function interval(date1, date2) { 
 
    if (date1 > date2) { // swap 
 
     var result = interval(date2, date1); 
 
     result.years = -result.years; 
 
     result.months = -result.months; 
 
     result.days = -result.days; 
 
     return result; 
 
    } 
 
    result = { 
 
     years: date2.getYear() - date1.getYear(), 
 
     months: date2.getMonth() - date1.getMonth(), 
 
     days: date2.getDate() - date1.getDate() 
 
    }; 
 
    if (result.days < 0) { 
 
     result.months--; 
 
     // days = days left in date1's month, 
 
     // plus days that have passed in date2's month 
 
     var copy1 = new Date(date1.getTime()); 
 
     copy1.setDate(32); 
 
     result.days = 32-date1.getDate()-copy1.getDate()+date2.getDate(); 
 
    } 
 
    if (result.months < 0) { 
 
     result.years--; 
 
     result.months+=12; 
 
    } 
 
    return result; 
 
} 
 

 
// Be aware that the month argument is zero-based (January = 0) 
 
var date1 = new Date(2015, 4-1, 6); 
 
var date2 = new Date(2015, 5-1, 9); 
 

 
document.write(JSON.stringify(interval(date1, date2)));

閏年(2月29日)を扱います。このソリューションと私たちが自然にやる方法で月間の長さの違いを考えています(私は思う)。

たとえば、2015年2月28日から2015年3月28日までの期間は、28日ではなく、正確に1か月と見なされます。両日とも2016年であれば、その差は29日ではなく、正確に1か月になります。

正確に同じ月日を使用しているが、異なる年の日付は、正確な年数の差が常にあります。したがって、2015-03-01と2016-03-01の間の差は、(1年として365日を計算するため)1年と1日ではなく、正確に1年になります。

+0

すごいです!説明してくれてありがとう! –

+0

この回答が必要な場合は、それを受け入れることを検討してください(回答の左にある灰色のチェックマークをクリックしてください)。 – trincot

+0

これがあなたの質問に答えたかどうかをフィードバックしてもらえますか? – trincot

0

2つの選択肢があります。の条件をすべて削除するか、elseの文をifに書き込んで、dayDiff < 365のケースを処理します。

あなたのロジック次のとおりです。

function age(year, month, day) { 
 

 
    var today = new Date(); 
 
    var endDate = new Date(year, month, day).getTime(); 
 
    var dayDiff = Math.floor((endDate - today)/86400000); 
 

 

 
    if (dayDiff >= 365) { 
 
    var year = Math.floor(dayDiff/365); 
 
    var remainder = Math.floor(dayDiff) - (year * 365); 
 
    var months = Math.floor(remainder/30); 
 
    } else { 
 
    var year = 0; 
 
    var remainder = Math.floor(dayDiff) - (year * 365); 
 
    var months = Math.floor(remainder/30); 
 
    } 
 

 
    var days = Math.floor(remainder) - (months * 30); 
 

 
    return year + " years" + " " + months + " months" + " " + days + "  days"; 
 
} 
 

 
document.write("<p>" + age(2017, 11, 17) + "</p>"); 
 
document.write("<p>" + age(2016, 7, 11) + "</p>");

+0

ありがとうございます! –

+0

どのソリューションを選択しましたか? :) – PinkTurtle

関連する問題