我正尝试使用Java程序为我的数据库中的人生成随机出生日期。我将如何做到这一点?生成随机出生日期
生成随机出生日期
回答
import java.util.GregorianCalendar;
public class RandomDateOfBirth {
public static void main(String[] args) {
GregorianCalendar gc = new GregorianCalendar();
int year = randBetween(1900, 2010);
gc.set(gc.YEAR, year);
int dayOfYear = randBetween(1, gc.getActualMaximum(gc.DAY_OF_YEAR));
gc.set(gc.DAY_OF_YEAR, dayOfYear);
System.out.println(gc.get(gc.YEAR) + "-" + (gc.get(gc.MONTH) + 1) + "-" + gc.get(gc.DAY_OF_MONTH));
}
public static int randBetween(int start, int end) {
return start + (int)Math.round(Math.random() * (end - start));
}
}
这不是一个统一的分布,因为例如在二月应该有更少的人。 – lbalazscs 2013-05-16 07:55:44
@lbalazscs - 确实。我更新了这个例子,现在应该会好一点。 – Saul 2013-05-16 09:33:54
为了完整起见 - 您应该通过'Calendar'类('Calendar.YEAR','Calendar.DAY_OF_YEAR')使用访问常量,而不是通过实例'gc'。 – mareckmareck 2015-03-13 10:14:59
java.util.Date
有constructor接受毫秒自大纪元,和java.util.Random
有a method,可以给你的毫秒随机数。你需要为随机值设置一个范围,具体取决于你想要的DOB的范围,但那些应该这样做。
非常大致为:
Random rnd;
Date dt;
long ms;
// Get a new random instance, seeded from the clock
rnd = new Random();
// Get an Epoch value roughly between 1940 and 2010
// -946771200000L = January 1, 1940
// Add up to 70 years to it (using modulus on the next long)
ms = -946771200000L + (Math.abs(rnd.nextLong()) % (70L * 365 * 24 * 60 * 60 * 1000));
// Construct a date
dt = new Date(ms);
这正是我开始思考,当我第一次读到这个问题。 – AJMansfield 2013-05-23 12:41:08
这个答案更符合我的偏好。当单个号码可以确定它时,不需要对月,日和年进行单独的随机呼叫。 – ewall 2015-04-10 02:58:44
这是一个不错的和简单的解决方案,但我宁愿使用'RandomUtils.nextLong(0,70L * 365 * 24 * 60 * 60 * 1000);'从apache lang3 – Alissa 2017-04-10 14:26:23
您需要定义一个随机的日期,对吧?
这样做的一种简单方法是,以生成一个新的Date
对象,使用long
(time in milliseconds since 1st January, 1970)和一个。减去随机long
:
new Date(Math.abs(System.currentTimeMillis() - RandomUtils.nextLong()));
(RandomUtils从Apache的百科全书郎截取)。
当然,这远远不是一个真正的随机日期(例如,你不会得到1970年之前的日期),但我认为它足够满足你的需求。
int year = // generate a year between 1900 and 2010;
int dayOfYear = // generate a number between 1 and 365 (or 366 if you need to handle leap year);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, randomYear);
calendar.set(Calendar.DAY_OF_YEAR, dayOfYear);
Date randomDoB = calendar.getTime();
是真的很麻烦只使用标准随机? – AJMansfield 2013-05-23 12:42:04
这个答案有点过时了。当我输入'new Date(Math.abs(System.currentTimeMillis() - RandomUtils.nextLong()));'时,它显示该方法已被弃用。但是我无法在其他地方找到并行等效方法。 – Yokhen 2014-11-23 19:46:58
生成出生的随机日期:
否则,您可以通过使用Calendar
类来创建你自己的日期
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(randomDOB());
}
}
public static String randomDOB() {
int yyyy = random(1900, 2013);
int mm = random(1, 12);
int dd = 0; // will set it later depending on year and month
switch(mm) {
case 2:
if (isLeapYear(yyyy)) {
dd = random(1, 29);
} else {
dd = random(1, 28);
}
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
dd = random(1, 31);
break;
default:
dd = random(1, 30);
break;
}
String year = Integer.toString(yyyy);
String month = Integer.toString(mm);
String day = Integer.toString(dd);
if (mm < 10) {
month = "0" + mm;
}
if (dd < 10) {
day = "0" + dd;
}
return day + '/' + month + '/' + year;
}
public static int random(int lowerBound, int upperBound) {
return (lowerBound + (int) Math.round(Math.random()
* (upperBound - lowerBound)));
}
public static boolean isLeapYear(int year) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
int noOfDays = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
if (noOfDays > 365) {
return true;
}
return false;
}
}
我学习Scala和结束了谷歌搜索Java解决方案用于选择范围之间的随机日期。我发现this帖子超级有用,这是我的最终解决方案。希望它可以帮助未来的Scala和Java程序员。
import java.sql.Timestamp
def date_rand(ts_start_str:String = "2012-01-01 00:00:00", ts_end_str:String = "2015-01-01 00:00:00"): String = {
val ts_start = Timestamp.valueOf(ts_start_str).getTime()
val ts_end = Timestamp.valueOf(ts_end_str).getTime()
val diff = ts_end - ts_start
println(diff)
val ts_rand = new Timestamp(ts_start + (Random.nextFloat() * diff).toLong)
return ts_rand.toString
} //> date_rand: (ts_start_str: String, ts_end_str: String)String
println(date_rand()) //> 94694400000
//| 2012-10-28 18:21:13.216
println(date_rand("2001-01-01 00:00:00", "2001-01-01 00:00:00"))
//> 0
//| 2001-01-01 00:00:00.0
println(date_rand("2001-01-01 00:00:00", "2010-01-01 00:00:00"))
//> 283996800000
//| 2008-02-16 23:15:48.864 //> 2013-12-21 08:32:16.384
片段为Java 8基于溶液:
Random random = new Random();
int minDay = (int) LocalDate.of(1900, 1, 1).toEpochDay();
int maxDay = (int) LocalDate.of(2015, 1, 1).toEpochDay();
long randomDay = minDay + random.nextInt(maxDay - minDay);
LocalDate randomBirthDate = LocalDate.ofEpochDay(randomDay);
System.out.println(randomBirthDate);
注:这生成1Jan1900(含)和1Jan2015(不包括)之间的随机日期。
注意:它是基于epoch days,即天相1Jan1970(EPOCH) - 正EPOCH后的意义,EPOCH之前否定意义
您还可以创建一个小工具类:
public class RandomDate {
private final LocalDate minDate;
private final LocalDate maxDate;
private final Random random;
public RandomDate(LocalDate minDate, LocalDate maxDate) {
this.minDate = minDate;
this.maxDate = maxDate;
this.random = new Random();
}
public LocalDate nextDate() {
int minDay = (int) minDate.toEpochDay();
int maxDay = (int) maxDate.toEpochDay();
long randomDay = minDay + random.nextInt(maxDay - minDay);
return LocalDate.ofEpochDay(randomDay);
}
@Override
public String toString() {
return "RandomDate{" +
"maxDate=" + maxDate +
", minDate=" + minDate +
'}';
}
}
,并使用它像这样:
RandomDate rd = new RandomDate(LocalDate.of(1900, 1, 1), LocalDate.of(2010, 1, 1));
System.out.println(rd.nextDate());
System.out.println(rd.nextDate()); // birthdays ad infinitum
这是一个很好的答案,但通过对构造函数中的min和max进行toEpochDay()转换并保存int结果而不是LocalDates,实用程序类可能会更有效一些。然后只需要进行一次,而不是每次调用nextDate()一次。 – 2015-11-11 18:00:20
您将以dd/mm/yyyy得到日期
您可以使用数学。随机()函数,就像我在下面
在这里完成我们生成3个随机数字1至31,1至12,1990至2016年和连接中的“/”他们
之间
public static String getRandomJoinDate()
{
String date="";
int yearBegin=1990;
int yearEnd=2016-yearBegin;
date=""+(1 + (int)(Math.random() * 31)+"/"+(1 + (int)(Math.random() * 12)+"/"+(yearBegin + (int)(Math.random() * yearEnd))));
return date;
}
进一步了解下面的Math.random()链接可以帮助
Math.random() explained
解释一下.. !! – 2016-06-06 12:12:33
您可以检出randomizer随机数据generation.This库有助于下面的示例代码从给定的模型class.Checkout创建随机数据。
public class Person {
@DateValue(from = "01 Jan 1990",to = "31 Dec 2002" , customFormat = "dd MMM yyyy")
String dateOfBirth;
}
//Generate random 100 Person(Model Class) object
Generator<Person> generator = new Generator<>(Person.class);
List<Person> persons = generator.generate(100);
由于有很多是使用注解访问,您也可以创建自定义数据generator.I建议你去通过提供的库页的文档,内置的数据发生器。
看看这个方法:
public static Date dateRandom(int initialYear, int lastYear) {
if (initialYear > lastYear) {
int year = lastYear;
lastYear = initialYear;
initialYear = year;
}
Calendar cInitialYear = Calendar.getInstance();
cInitialYear.set(Calendar.YEAR, 2015);
long offset = cInitialYear.getTimeInMillis();
Calendar cLastYear = Calendar.getInstance();
cLastYear.set(Calendar.YEAR, 2016);
long end = cLastYear.getTimeInMillis();
long diff = end - offset + 1;
Timestamp timestamp = new Timestamp(offset + (long) (Math.random() * diff));
return new Date(timestamp.getTime());
}
如果你不介意加入一个新的图书馆,以你的代码,你可以使用MockNeat(免责声明:我是作者之一)。
MockNeat mock = MockNeat.threadLocal();
// Generates a random date between [1970-1-1, NOW)
LocalDate localDate = mock.localDates().val();
System.out.println(localDate);
// Generates a random date in the past
// but beore 1987-1-30
LocalDate min = LocalDate.of(1987, 1, 30);
LocalDate past = mock.localDates().past(min).val();
System.out.println(past);
LocalDate max = LocalDate.of(2020, 1, 1);
LocalDate future = mock.localDates().future(max).val();
System.out.println(future);
// Generates a random date between 1989-1-1 and 1993-1-1
LocalDate start = LocalDate.of(1989, 1, 1);
LocalDate stop = LocalDate.of(1993, 1, 1);
LocalDate between = mock.localDates().between(start, stop).val();
System.out.println(between);
对于Java8 - > Assumming出生的数据必须是最新的前一天:
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Period;
import java.time.temporal.ChronoUnit;
import java.util.Random;
public class RandomDate {
public static LocalDate randomBirthday() {
return LocalDate.now().minus(Period.ofDays((new Random().nextInt(365 * 70))));
}
public static void main(String[] args) {
System.out.println("randomDate: " + randomBirthday());
}
}
考虑使用['ThreadLocalRandom'](https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/ThreadLocalRandom.html),而不是实例化一个新的['Random'](https ://docs.oracle.com/javase/9/docs/api/java/util/Random.html)。 – 2017-12-04 05:56:23
是的。更好的练习。 – 2017-12-04 07:24:52
我认为这将这样的伎俩:
public static void main(String[] args) {
Date now = new Date();
long sixMonthsAgo = (now.getTime() - 15552000000l);
long today = now.getTime();
for(int i=0; i<10; i++) {
long ms = ThreadLocalRandom.current().nextLong(sixMonthsAgo, today);
Date date = new Date(ms);
System.out.println(date.toString());
}
}
如果你不介意一个第三方库,Utils库有一个RandomDateUtils,它会生成随机java.util.Dates以及来自Java 8的所有日期,时间,时刻和持续时间date and time API
LocalDate birthDate = RandomDateUtils.randomPastLocalDate();
LocalDate today = LocalDate.now();
LocalDate under18YearsOld = RandomDateUtils.randomLocalDate(today.minus(18, YEARS), today);
LocalDate over18YearsOld = RandomDateUtils.randomLocalDateBefore(today.minus(18, YEARS));
它是在Maven中央仓库在:
<dependency>
<groupId>com.github.rkumsher</groupId>
<artifactId>utils</artifactId>
<version>1.0</version>
</dependency>
- 1. 生成随机日期
- 2. 生成随机生日
- 3. 这个随机出生日期发生器有什么问题?
- 4. 使用Java中的Switch根据年龄段生成随机出生日期
- 5. 机器人 - 随机生成的日期和时间
- 6. 仅在工作日生成随机日期
- 7. 随机数生成
- 8. 生成随机数
- 9. 生成随机图
- 10. 生成随机ROWID
- 11. 生成随机数
- 12. ArrayList随机生成
- 13. Haskell随机生成
- 14. 生成随机ASCII
- 15. 生成随机数
- 16. 生成随机词
- 17. 生成随机数
- 18. Javascript随机生成
- 19. 随机数生成
- 20. Akka期货并行随机数生成
- 21. 随机数生成机制
- 22. 通过随机字符生成生成随机名字太慢
- 23. 生成随机数:计算随机生成的x次数
- 24. 随机数生成器帮助不生成随机数 - C
- 25. 随机输出的生成3n + 1 pblm
- 26. 随机生成器出错了?
- 27. Excel宏生成单个随机输出
- 28. 为明天的日期生成随机unix时间戳
- 29. 在特定年份生成随机日期
- 30. 在服务中生成随机日期和时间
请不要使用缩写词谜语;) – 2013-05-16 06:25:58