Un moyen simple consiste à convertir la date minimale et maximale en leur jour d'époque correspondant, à générer un entier aléatoire entre ces deux valeurs et enfin à le reconvertir en un LocalDate
. Le jour d'époque est obtenu avec toEpochDay()
qui est le nombre de jours depuis le 1970-01-01 (ISO).
Le problème avec la génération aléatoire d'une année, puis d'un mois, puis d'un jour est que vous avez une petite chance de tomber avec une date invalide (comme le 31 février). De plus, prendre un jour d'époque aléatoire garantit une distribution uniforme sur toutes les dates possibles.
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);
}
Notez que puisque la date minimale est en fait la toute première, vous pouvez la remplacer par 0.
Pour convertir cette LocalDate
dans un java.sql.Date
, vous pouvez vous référer à ce message
:
java.sql.Date date = java.sql.Date.valueOf(randomDate);