这个随机出生日期有什么问题?

Chr*_*ght 1 java random

我正在尝试为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();
}
Run Code Online (Sandbox Code Playgroud)

它执行正常,但在2008年或2009年,100个日期的输出结果全部为:

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
...
Run Code Online (Sandbox Code Playgroud)

但是,我需要25到50年前的日期.我错过了什么?

Noe*_*l M 19

相当棘手的问题,但你的ONE_YEAR_AS_MILLISECONDS常数中有数字溢出.

将整数文字更改为long:

private static long ONE_YEAR_AS_MILLISECONDS = 365L * 24L * 60L * 60L * 1000L;
Run Code Online (Sandbox Code Playgroud)

现在对我来说很好.

编辑:

因此,当我正在解决这个问题时,我没有使用这个Calendar类:

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

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
return sdf.format(d);
Run Code Online (Sandbox Code Playgroud)

这对我来说看起来更容易一些.

  • 大!这是一个真正的陷阱.绝对是一个+1! (3认同)

All*_*lan 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();
}
Run Code Online (Sandbox Code Playgroud)