Gerar data de nascimento aleatória

Eu estou tentando gerar uma data de nascimento aleatória para as pessoas no meu database usando um programa em Java. Como eu faria isso?

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

java.util.Date tem um construtor que aceita milissegundos desde a Epoch e java.util.Random tem um método que pode fornecer um número random de milissegundos. Você vai querer definir um intervalo para o valor random, dependendo do intervalo de DOBs que você deseja, mas esses devem fazê-lo.

Muito grosso:

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

Snippet para uma solução baseada em 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); 

Nota : Isso gera uma data aleatória entre 1Jan1900 (inclusive) e 1Jan2015 (exclusivo).

Nota : É baseado em dias de época , ie dias relativos a 1Jan1970 ( EPOCH ) – significado positivo após EPOCH, significado negativo antes de EPOCH


Você também pode criar uma pequena class de utilitário:

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

e usá-lo assim:

 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 

Você precisa definir uma data aleatória, certo?

Uma maneira simples de fazer isso é gerar um novo object Date , usando um long ( tempo em milissegundos desde 1º de janeiro de 1970 ) e subtrair um long random:

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

( RandomUtils é obtido do Apache Commons Lang).

Claro, isso está longe de ser uma data aleatória real (por exemplo, você não terá data antes de 1970), mas acho que será suficiente para suas necessidades.

Caso contrário, você pode criar sua própria data usando a class Calendar :

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

Gerando Data de Nascimento aleatória:

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

Você pode verificar aleatoriedade para geração de dados randoms.Esta biblioteca ajuda a criar dados randoms de determinada class Model.Checkout abaixo código de exemplo.

 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 generator = new Generator<>(Person.class); List persons = generator.generate(100); 

Como há muitos construído em gerador de dados é acessível usando anotação, você também pode criar gerador de dados personalizados.Eu sugiro que você vá através da documentação fornecida na página da biblioteca.

Veja este método:

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

Se você não se importa em adicionar uma nova biblioteca ao seu código, você pode usar o MockNeat (disclaimer: Eu sou um dos autores).

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

Para Java8 -> Supondo que os dados de nascimento devem ser anteriores ao dia atual:

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

Eu acho que isso vai fazer o truque:

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

Se você não se importar com uma biblioteca de terceiros, a biblioteca Utils tem um RandomDateUtils que gera java.util.Dates randoms e todas as datas, horas, instantes e durações da API de data e hora do Java 8

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

Está no Repositório Central do Maven em:

  com.github.rkumsher utils 1.3  

Eu estou estudando Scala e acabei pesquisando soluções Java para escolher uma data aleatória entre intervalo. Eu achei este post super útil e esta é a minha solução final. Espero que possa ajudar futuros programadores de Scala e 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