2010-07-02 75 views
1

我試圖在25到50年前爲出生日期寫一個隨機出生日期生成器。我堅持使用Java 1.4,並試圖通過java.util.Calendar來解決這個問題(是的,是的,我知道我應該使用Joda庫)。下面是我在哪裏:這個隨機出生日期發生器有什麼問題?

private static long ONE_YEAR_AS_MILLISECONDS = 365*24*60*60*1000; 
private static long TWENTY_FIVE_YEARS_AS_MILLISECONDS = 25*ONE_YEAR_AS_MILLISECONDS; 
private static long FIFTY_YEARS_AS_MILLISECONDS = 50*ONE_YEAR_AS_MILLISECONDS; 

private static String generateDOB() 
{ 
    //Equation for calculating a random number within a given range is as follows: Min + (int)(Math.random() * ((Max - Min) + 1)) 
    long someTimeBetween25And50YearsInMilliSeconds = TWENTY_FIVE_YEARS_AS_MILLISECONDS + 
       (long)(Math.random() * ((FIFTY_YEARS_AS_MILLISECONDS - TWENTY_FIVE_YEARS_AS_MILLISECONDS) + 1)); 
    Calendar dob = Calendar.getInstance(); 
    dob.setTimeInMillis(dob.getTimeInMillis() - someTimeBetween25And50YearsInMilliSeconds); 
    StringBuffer sb = new StringBuffer(); 
    sb.append(dob.get(Calendar.YEAR)).append("/").append(dob.get(Calendar.MONTH)+1).append("/").append(dob.get(Calendar.DAY_OF_MONTH)); 
    return sb.toString(); 
} 

它執行好了,但100日的輸出yeilds所有的人在任何2008年或2009:

2008/10/8 
2008/9/22 
2008/7/26 
2008/8/20 
2008/3/31 
2008/10/1 
2009/1/3 
2009/2/2 
2009/4/9 
2008/9/20 
... 

不過,我需要25-50日期多年前。我錯過了什麼?

+0

爲了記錄在案,甚至糾正,你的代碼不會accrurate,因爲在超過365天一年。 25年後,你將在三天之內關閉,所以你的範圍不會超過25-50年,你將有3-7天的錯誤窗口。 – McKay 2010-11-01 20:18:39

回答

19

相當有問題,但你得到一個數字溢出在你的ONE_YEAR_AS_MILLISECONDS常數。

更改整數常量爲long:

private static long ONE_YEAR_AS_MILLISECONDS = 365L * 24L * 60L * 60L * 1000L; 

現在的工作對我罰款。

編輯

因此,雖然我工作了這一點,我沒有使用Calendar類:

Date d = new Date(System.currentTimeMillis() - someTimeBetween25And50YearsInMilliSeconds); 

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
return sdf.format(d); 

這看起來有點更容易閱讀給我。

+3

太棒了!這是一個真正的難題。 Definitly a +1! – 2010-07-02 11:54:46

+0

Oooh,不錯的地方!感謝一堆(並且爲擺脫日曆而付出的額外榮譽) – 2010-07-02 12:17:01

5

我不知道你錯過了什麼,但我會用Calendar.roll

private static String generateDOB() 
{ 

    Calendar dob = Calendar.getInstance(); 

    int year = (int)(Math.random() * 25) + 25; 


    dob.roll(Calendar.YEAR, -year); 
    StringBuffer sb = new StringBuffer(); 
    sb.append(dob.get(Calendar.YEAR)).append("/").append(dob.get(Calendar.MONTH)+1).append("/").append(dob.get(Calendar.DAY_OF_MONTH)); 
    return sb.toString(); 
}