Một cách đơn giản là chuyển đổi ngày tối thiểu và tối đa thành ngày kỷ nguyên tương ứng của chúng, tạo một số nguyên ngẫu nhiên giữa hai giá trị đó và cuối cùng chuyển đổi nó trở lại LocalDate
. Ngày kỷ nguyên được lấy bằng toEpochDay()
là số ngày kể từ 1970-01-01 (ISO).
Vấn đề với việc tạo ra một năm, sau đó là tháng và ngày ngẫu nhiên là bạn có một cơ hội nhỏ để rơi vào một ngày không hợp lệ (như ngày 31 tháng 2). Ngoài ra, lấy một ngày kỷ nguyên ngẫu nhiên đảm bảo sự phân bổ đồng đều trên tất cả các ngày có thể có.
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);
}
Lưu ý rằng vì ngày tối thiểu thực sự là ngày đầu tiên, bạn có thể thay thế nó bằng 0.
Để chuyển đổi LocalDate
này thành một java.sql.Date
, bạn có thể tham khảo bài đăng này
:
java.sql.Date date = java.sql.Date.valueOf(randomDate);