簡體   English   中英

使用java.time生成隨機LocalDate

[英]Generate a random LocalDate with java.time

我正在編寫一些代碼,用隨機數據填充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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM