Prostym sposobem jest przekonwertowanie daty minimalnej i maksymalnej na odpowiadający im dzień epoki, wygenerowanie losowej liczby całkowitej między tymi dwiema wartościami, a następnie przekonwertowanie jej z powrotem na LocalDate
. Dzień epoki uzyskuje się za pomocą toEpochDay()
czyli liczba dni od 1970-01-01 (ISO).
Problem z wygenerowaniem losowego roku, potem miesiąca, a potem dnia polega na tym, że masz małą szansę na wypadnięcie z nieprawidłową datą (np. 31 lutego). Ponadto wybranie losowego dnia epoki gwarantuje równomierny rozkład na wszystkie możliwe daty.
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);
}
Zwróć uwagę, że ponieważ data minimalna jest w rzeczywistości pierwszą, możesz ją zastąpić 0.
Aby przekonwertować ten LocalDate
w java.sql.Date
, możesz zapoznać się z tym postem
:
java.sql.Date date = java.sql.Date.valueOf(randomDate);