使用java.time生成随机LocalDate

我正在编写一些代码,用随机数据填充MySQL数据库以进行测试。 我需要填充一个DATE列,其中包含1970-2015的随机日期。

这是相关的方法:

 public Date dateGenerator() throws Exception { Random ry = new Random(); Random rm = new Random(); Random rd = new Random(); int year = 1969 + ry.nextInt(2015-1969+1); int month = 1 + rm.nextInt(12); int day = 1 + rm.nextInt(31); if (month==2 && day>28){ day = day - 3; } else { if((month%2==0 && month != 8 ) && day==31 ){ day = day -1; } } } 

我的目的是创建三个随机整数(日,月,年),并以某种方式将它们组合成一些Date对象以传递给数据库。 但数据库拒绝我尝试提供的所有内容。

如果可以为我提供基于最新java.time库的建议,那对我来说会非常有教育意义。

一种简单的方法是将最小和最大日期转换为相应的纪元日,在这两个值之间生成一个随机整数,最后将其转换回LocalDate 。 使用toEpochDay()获得纪元日,这是自1970-01-01(ISO)以来的天数。

生成随机年份,然后是月份和日期的问题是,您有可能在无效日期(如2月31日)下降。 此外,采取随机的纪元日保证在所有可能的日期均匀分布。

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

请注意,由于最小日期实际上是第一个,因此可以将其替换为0。

要将此LocalDate转换为java.sql.Date ,您可以参考这篇文章 :

 java.sql.Date date = java.sql.Date.valueOf(randomDate); 

尝试这样的事情。

 public static void main(String[] args) { LocalDate start = LocalDate.of(1970, Month.JANUARY, 1); long days = ChronoUnit.DAYS.between(start, LocalDate.now()); LocalDate randomDate = start.plusDays(new Random().nextInt((int) days + 1)); System.out.println(randomDate); }