2010-07-02 5 views
1

저는 25-50 년 전에 생년월일의 임의의 생년월일 작성기를 작성하려고합니다. 자바 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 날짜의 출력이 2008 또는 2009 중 하나에서 모두를 yeilds : 내가 어디에 있어요 여기 그러나

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

을 사용 년. 25 년 후에는 3 일이 지나면 범위가 25-50 년이되지 않으며 3-7 일간의 오류 창이 발생합니다. – McKay

답변

19

꽤 문제가 있지만 숫자 상수가 ONE_YEAR_AS_MILLISECONDS 상수에서 발생합니다.

변경 걷고에 정수 리터럴 : 지금 나를 위해

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

작품 잘.

편집는 :

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

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

나 읽기가 조금 더 쉽게 보이는 :이 운동을하는 동안

따라서, 나는 Calendar 클래스를 사용하지 않았다. 더 365 일이 있기 때문에, 코드가 accrurate되지 않습니다

+3

좋아요! 그게 진짜 잡았다. 확실히 +1! –

+0

우, 멋진 지점! 고마워요 (그리고 캘린더를 제거하기위한 여분의 명성) –

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(); 
}