Create a random date of birth

I am trying to create a random birthday for people in my database using a Java program. How should I do it?

+60
java random
Oct 21 '10 at 8:00
source share
14 answers
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)); } } 
+74
Oct 21 '10 at 8:41
source share

java.util.Date has a constructor that takes milliseconds since The Epoch, and java.util.Random has a method that can give you a random number of milliseconds. You want to set the range for a random value depending on the DOB range you want, but this should be done.

Very rude:

 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); 
+37
Oct 21 '10 at 8:14
source share

Fragment for a solution based on 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); 

Note This creates a random date between 1Jan1900 (inclusive) and 1Jan2015 (exclusive).

Note It is based on the days of the era , i.e. days relative to 1Jan1970 ( EPOCH ) - positive value after EPOCH, negative value before EPOCH




You can also create a small utility class:

 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 + '}'; } } 

and use it as follows:

 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 
+34
Jul 02 '15 at 19:17
source share

You need to determine a random date, right?

An easy way to do this is to create a new Date object using long ( time in milliseconds since January 1, 1970 ) and subtract the random long :

 new Date(Math.abs(System.currentTimeMillis() - RandomUtils.nextLong())); 

( RandomUtils taken from Apache Commons Lang).

Of course, this is far from a real random date (for example, you will not get the date before 1970), but I think this will be enough for your needs.

Otherwise, you can create your own date using the Calendar class:

 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(); 
+20
Oct 21 '10 at 8:15
source share

For Java8 -> Assimilation of birth data should be up to the current day:

 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()); } } 
+7
Mar 06 '17 at 5:12
source share

If you don't mind adding a new library to your code, you can use MockNeat (disclaimer: I am one of the authors).

 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); 
+3
Mar 05 '17 at 19:30
source share

Random data generation Date of birth:

 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; } } 
+2
May 16 '13 at 6:02
source share

You can check randomizer to generate random data. This library helps to create random data from this Model.Checkout class below the sample code.

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

Since there are many built-in data generators available through annotation, you can also create a custom data generator. I suggest you go through the documentation provided on the library page.

+2
Oct 24 '16 at 18:13
source share

Check out this method:

 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()); } 
+2
Dec 08 '16 at 18:51
source share

I think this will do the trick:

 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()); } } 
+1
Mar 25 '17 at 10:48
source share

If you don't mind a third-party library, the Utils library has RandomDateUtils , which generates random java.util.Dates and all dates, times, moments and durations from 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)); 

It is located in the Maven Central Repository at:

 <dependency> <groupId>com.github.rkumsher</groupId> <artifactId>utils</artifactId> <version>1.3</version> </dependency> 
+1
Aug 07 '17 at 22:52
source share

easiest method:

 public static LocalDate randomDateOfBirth() { final int maxAge = 100 * 12 * 31; return LocalDate.now().minusDays(new Random().nextInt(maxAge)); } 
+1
Sep 06 '19 at 17:44
source share

I study Scala and finish Googling Java solutions to select a random date between a range. I found this post super helpful and this is my final decision. Hope this helps future Scala and Java programmers.

 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 
0
Jun 28 '15 at 15:39
source share

you will get the date in dd / mm / yyyy format
You can use the Math.random () function, as I did below

here we generate 3 random numbers from 1 to 31.1 to 12.1990 to 2016 and combine "/" between them

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

to learn more about the Math.random () link below can help Math.random () explained

-one
Jun 06 '16 at 11:52
source share



All Articles