问题描述
我正在尝试为 25 到 50 年前的出生日期编写一个随机的出生日期生成器.我坚持使用 Java 1.4,并试图通过 java.util.Calendar 完成此操作(是的,是的,我知道我应该使用 Joda 库).这是我所在的位置:
I'm trying to write a random date of birth generator for a date of birth between 25 and 50 years ago. I'm stuck with Java 1.4 and am attempting to accomlish this via java.util.Calendar (yes, yes, I know I should be using the Joda libraries). Here's where I'm at:
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 年:
It executes OK, but an output of 100 dates yeilds all of them in either 2008 or 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 年前的日期.我错过了什么?
However, I need dates between 25-50 years ago. What am I missing?
推荐答案
这个问题很棘手,但是您的 ONE_YEAR_AS_MILLISECONDS
常量中出现数字溢出.
Quite a gotcha that problem, but you're getting a numeric overflow in your ONE_YEAR_AS_MILLISECONDS
constant.
将整数文字更改为长整型:
Change the integer literals to longs:
private static long ONE_YEAR_AS_MILLISECONDS = 365L * 24L * 60L * 60L * 1000L;
现在对我来说很好用.
编辑:
因此,在我解决这个问题时,我没有使用 Calendar
类:
Consequently, while I was working this out, I didn't use the Calendar
class:
Date d = new Date(System.currentTimeMillis() - someTimeBetween25And50YearsInMilliSeconds);
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
return sdf.format(d);
这对我来说看起来更容易阅读.
That looks a bit easier to read to me.
这篇关于这个随机出生日期生成器有什么问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!