【问题标题】:Generate a random LocalDate with java.time使用 java.time 生成随机 LocalDate
【发布时间】:2016-03-07 04:46:32
【问题描述】:

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

下面是相关方法:

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 库向我提供建议,那对我来说将是非常有教育意义的。

【问题讨论】:

  • 好的,我认为它工作得很好 :) 感谢您的友好贡献,我被困了好几个小时......转换后(我在方法内完成)虽然它要求main 类中的另一个。只是一个进一步的说明:)

标签: java mysql date random java-time


【解决方案1】:

一种简单的方法是将最小和最大日期转换为其对应的纪元日,在这两个值之间生成一个随机整数,最后将其转换回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,可以参考this post

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

【讨论】:

  • 使用LocalDate.ofEpochDay(0)得到minDay会稍微提高可读性。
【解决方案2】:

试试这样的。

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

【讨论】:

  • 感谢您的及时回复。有没有办法将 LocalDate 转换为 Date 以便将其提供给数据库?或者也许改变声明? (虽然我尝试过这种方式但失败了)
  • 您可以尝试 Basil 的早期建议,即使用 java.sql.Date.valueOf(randomDate),但是,我很确定如果您使用 randomDate.format(DateTimeFormatter.ISO_LOCAL_DATE),大多数数据库都会接受它在您的插入语句中。
猜你喜欢
  • 2014-05-21
  • 2021-06-19
  • 2015-03-14
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 2014-09-21
  • 2021-12-29
相关资源
最近更新 更多