2011-03-21 89 views
4

我是一個新手,並感謝有人幫助我。如何計算在Java中的兩個日期之間的年和月之間的年齡

當我試圖用下面的來源計算年齡時,它並沒有給我我想要的價值。例如:日期 - > 2010年12月29日,dob-> 30/12/1992,它會給我18而不是17. 有什麼方法可以根據上述兩個日期返回我17yrs 11mths而不是18個月的?

public double getAgeAsOf(Date date) { 
     return ((date.getTime() - dob.getTime())/(1000*60*60*24))/365; 
    } 

謝謝。

+1

這是來自閏年 - 在你的時間框架中有相當一些閏年,所以你的公式現在是錯誤的4天。 – 2011-03-21 14:24:10

回答

16

可以使用數月和數年爲單位使用Joda Time和計算值之間(這是你在這裏得到了什麼)。

示例代碼:

import org.joda.time.*; 

public class Test { 
    public static void main(String[] args) { 
     LocalDate dob = new LocalDate(1992, 12, 30); 
     LocalDate date = new LocalDate(2010, 12, 29); 

     Period period = new Period(dob, date, PeriodType.yearMonthDay()); 
     System.out.println(period.getYears() + " years and " + 
          period.getMonths() + " months"); 
    } 
} 

(該使用週期類型,其中包括天爲好,但不會影響答案)

一般來說,約達時間是一個更好的API比使用日期/日曆 - 而且如果您可以避免,您真的不想進行自己執行日期計算的業務。它很快就會變得混亂。

根據aioobe的回答,如果你劃分兩個整數表達式,算術將在整數算術中執行,這可能不是你想要的 - 但是對於日期和時間算術,只是讓其他人在第一個中做出努力工作地方:)

上面的代碼將使用ISO-8601日曆的方式,這基本上是公曆。如果您想使用其他內容,請在LocalDate的年/月/日之後將其指定爲另一個構造函數參數。

+0

哪些是使用JODA Time API時要導入的jar文件? – Deepak 2011-03-21 14:31:08

+2

@Deepak:就是二進制發行版中的joda-time-(version).jar。 – 2011-03-21 14:35:31

2

你有幾個問題,你的代碼:

  1. 你做的整數除法,這截斷結果最接近的較小的整數。

    例如,如果你把729除以365,你會得到1(和你已經失去小數部分,其計算月等,當你需要)

  2. 的另一個問題是,你正在使用一年365天,而實際上更接近365.25(包括閏年的額外天數)。

這裏的代碼稍加改進的片段:

import java.util.Date; 

public class Test { 

    static double msPerGregorianYear = 365.25 * 86400 * 1000; 

    static Date dob = new Date(1992, 12, 30); 

    public static double getAgeAsOf(Date date) { 
     return (date.getTime() - dob.getTime())/msPerGregorianYear; 
    } 

    public static void main(String[] args) { 

     double years = getAgeAsOf(new Date(2010, 12, 29)); 

     // years == 17.99315537303217 

     int yy = (int) years; 
     int mm = (int) ((years - yy) * 12); 

     // Prints "17 years and 11 moths." 
     System.out.printf("%d years and %d moths.", yy, mm); 
    } 
} 

如果你曾經做任何事情比找出給定的毫秒數年數比較複雜,我建議你把一些時間庫,如Jon Skeet所建議的Joda time

+0

17 + 364/365下降到17個。這個問題是閏年,正如Paulo的評論所指出的那樣。 – geoffspear 2011-03-21 14:26:55

+0

這仍然假定一年365天。這並不總是正確的。基本上,日期計算最好用API來完成,而不是像這樣執行簡單的算術。 – 2011-03-21 14:27:33

+0

對。答案已更新。一般我都同意。但對於這樣的簡單任務,對於初學者的問題,解釋出錯的地方以及如何糾正它更具有啓發性。通過建議解決他特定問題的jar文件,OP將在一個月左右的時間內回到另一個整數除法問題。 – aioobe 2011-03-21 14:32:19

相關問題