Uma maneira simples é converter a data mínima e máxima para o dia da época correspondente, gerar um número inteiro aleatório entre esses dois valores e, finalmente, convertê-lo de volta para um
LocalDate
. O dia da época é obtido com toEpochDay()
que é a contagem de dias desde 1970-01-01 (ISO). O problema de gerar um ano aleatório, depois um mês e depois um dia é que você tem uma pequena chance de cair com uma data inválida (como 31 de fevereiro). Além disso, tomar um dia de época aleatório garante uma distribuição uniforme em todas as datas possíveis.
public static void main(String... args) {
long minDay = LocalDate.of(1970, 1, 1).toEpochDay();
long maxDay = LocalDate.of(2015, 12, 31).toEpochDay();
long randomDay = ThreadLocalRandom.current().nextLong(minDay, maxDay);
LocalDate randomDate = LocalDate.ofEpochDay(randomDay);
System.out.println(randomDate);
}
Observe que, como a data mínima é realmente a primeira, você pode substituí-la por 0.
Para converter este
LocalDate
em um java.sql.Date
, você pode consultar esta postagem
:java.sql.Date date = java.sql.Date.valueOf(randomDate);