2015-12-02 97 views
3

我正在編寫一些代碼來爲測試目的使用隨機數據填充MySQL數據庫。我需要從1970-2015年的隨機日期填充DATE列。使用java.time生成隨機LocalDate

這裏的相關方法:

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庫提供給我一個建議,對我來說這將是非常有教育意義的。

+0

嘗試http://stackoverflow.com/questions/14771845/generating-random-date-time-in-java-joda-time – Hector

+0

好,我覺得它工作得很好:)謝謝您的實物捐助,我被困在這個......幾個小時之後......雖然它在main類中要求另一個轉換,但在轉換之後(我在該方法中做了這個轉換)。只是進一步說明:) – HappyCane

回答

8

一個簡單的方法是將最小和最大日期轉換爲它們相應的時期,在這兩個值之間生成一個隨機整數並最終將其轉換回LocalDate。該紀元日期是自1970-01-01(ISO)以來的天數toEpochDay()

生成一個隨機年份,然後一個月然後一天的問題是,你有一個小的機會下跌與無效的日期(如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); 
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); 
} 
+0

感謝您的及時迴應。有沒有辦法將'LocalDate'轉換爲Date以將其提供給數據庫?或者也許改變陳述? (雖然我已經嘗試過並且以這種方式失敗) – HappyCane

+0

你可以嘗試Basil的早期使用java.sql.Date.valueOf(randomDate)的建議,但是,我敢肯定,如果你使用randomDate.format,大多數數據庫都會接受它DateTimeFormatter.ISO_LOCAL_DATE)插入語句中。 – Raudbjorn