2017-05-09 59 views
-2

我需要計算日期,月份和年份兩個日期之間的精確差異。使用javascript計算年,月和日?

我有這樣的功能:

const getAge = (dateString) => { 
    const today = new Date(); 
    const birthDate = new Date(dateString); 
    let age = today.getFullYear() - birthDate.getFullYear(); 
    const m = today.getMonth() - birthDate.getMonth(); 
    if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) { 
     age -= 1; 
    } 
    return age; 
}; 

它接收YYYY-MM-DD格式的日期。此時輸出的確切年數(6年,如果是「生日」之前,則爲5年)。

我需要它輸出5年,11個月和29天(作爲例子)。

我該如何做到這一點?

+2

一般來說我建議使用[Moment.js(https://momentjs.com/)如果如果您在日期上進行大量工作,則可能。它會讓你得到[差異](https://momentjs.com/docs/#/displaying/difference/)並以任何你想要的方式設置這個持續時間的格式。 –

+2

一直在問這個問題。嘗試在你問之前進行搜索。 –

回答

0

也許這可以幫助你

const getAge = (dateString) => { 
    const today = new Date(); 
    const birthDate = new Date(dateString.replace(/-/g, '/')); 
    const yearsLater = new Date((birthDate.getFullYear()+1)+"/"+(birthDate.getMonth()+1)+"/"+birthDate.getDate()); 
    const monthsLater = new Date((birthDate.getFullYear())+"/"+(birthDate.getMonth()+2)+"/"+birthDate.getDate()); 
    const daysLater = new Date((birthDate.getFullYear())+"/"+(birthDate.getMonth()+1)+"/"+(birthDate.getDate()+1)); 

    years = Math.floor((today-birthDate)/(yearsLater-birthDate)); 
    dateMonths = (today-birthDate)%(yearsLater-birthDate); 
    months = Math.floor(dateMonths/(monthsLater-birthDate)); 
    dateDays = dateMonths % (monthsLater-birthDate); 
    days = Math.floor(dateDays/(daysLater-birthDate)); 
    return {"years": years, "months": months, "days": days}; 
}; 
+0

您應該將您的代碼作爲可運行代碼段發佈。請注意,OP的字符串格式是YYYY-MM-DD,它將被解析爲UTC。您的代碼會以YYYY/M/D格式生成並解析字符串,但可能根本無法正確解析,但可能與本地相同,因此會引入與主機時區偏移量相等的錯誤。爲什麼要構建一個字符串,並在可以直接將值賦給Date構造函數時依賴不可靠的解析? – RobG

+0

使用今天的日期給出了{{year:-1,months:-1,days:-1}}和2017-05-10上的'2016-05-11'給出了{{year:0,months:11,days :47}'。 – RobG

+0

我的不好,我編輯代碼與替換,現在與'YYYY/MM/DD'和'YYYY-MM-DD' – willicab

1

對我來說最好的解決方案是使用mementjs https://momentjs.com庫。

之後試試這個:

var d1= Date.parse("2017/05/08"); 
var d2= Date.parse("2015/07/15"); 

var m = moment(d1); 
var years = m.diff(d2, 'years'); 
m.add(-years, 'years'); 
var months = m.diff(d2, 'months'); 
m.add(-months, 'months'); 
var days = m.diff(d2, 'days'); 

var result = {years: years, months: months, days: days}; 
console.log(result); 
+0

答案不應依賴OP中未標記或使用的庫。 – RobG