2015-11-30 48 views
1

我試圖迭代通過日期而沒有成功,因爲發生了inifite循環,並且它不會停止在數據庫中創建記錄。爲什麼?無限循環嘗試遍歷Java中的日期

我有以下的方法,作爲參數傳遞的日期增加1,然後返回它更新。

public static Date addDays(Date date, int days) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.add(Calendar.DATE, days); 
    return cal.getTime(); 
} 

然後,我用它在一個for循環這樣...

for (Date initDate = fromDate; initDate.before(toDate); addDays(initDate, 1)) { 
    // Do something... 
} 

沒有fromdate和todate是從一個JTextField值解析成sql.Date這種方式。

private java.sql.Date fechaParser(String f) { 
    SimpleDateFormat formatDate = new SimpleDateFormat("dd/MM/yyyy"); 
    Date date; 

    try { 
     date = formatDate.parse(f); 
     java.sql.Date sqlDate = new java.sql.Date(date.getTime()); 

     return sqlDate; 
    } catch (ParseException e) { 
     JOptionPane.showMessageDialog(null, "Wrong date format."); 
     e.printStackTrace(); 
    } 

    return null; 
} 
+1

'initDate = addDays(initDate,1)'? – MadProgrammer

回答

7

您的addDays()函數返回一個新日期而不是更改參數1。

因此,你需要你的for循環的增量部分從:

for (...; addDays(initDate, 1)) { ... 

這樣:

for (...; initDate = addDays(initDate, 1)) { ... 
2

接受的答案是正確的。

從Java 8及更高版本開始,java.util.Date/.Calendar類現在已過時。

java.time

java.time框架構建在Java 8和更高版本取代了麻煩老java.util.Date/.Calendar類。新課程的靈感來自非常成功的Joda-Time框架,作爲其後繼者,概念相似但重新設計。由JSR 310定義。擴展ThreeTen-Extra項目。請參閱​​。

首先我們定義一個格式化程序,使用一個模式來匹配我們期望的輸入字符串。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 

的java.time框架包括一個類來表示一個日期只值,不受時間的日:LocalDate。該類上的靜態方法可以解析。

String input = "05/07/2013"; 
LocalDate localDate_Start = LocalDate.parse(input , formatter); 

如果用戶給了我們不錯的文字輸入時,parse方法拋出DateTimeParseException。所以我們應該抓住並處理這個例外。

try{ 
    LocalDate localDate_Start = LocalDate.parse(input , formatter); 
} catch (DateTimeParseException e) { 
    // … handle the exception … 
} 

LocalDate類包括plusDays方法添加天。

LocalDate localDate_Stop = localDate_Start.plusDays(someNumberOfDays); 

順便說一下,在日期時間工作中,我們通常使用半開式方法,其中開始包含而結束是排他性的。例如,一個星期將從星期一開始運行,但不包括下一個星期一。

一個while循環更有意義,我比你使用for循環

做一些我們必須從java.time.LocalDate轉換爲java.sql.Date數據庫工作。有一天,JDBC驅動程序將被更新爲直接處理java.time類型,但在此之前我們必須隱藏。尋找新增的轉換方法,如java.sql.Date.valueOf(LocalDate localDate)

LocalDate localDate = localDate_Start; 
while(localDate.isBefore(localDate_Stop)) { 
    // Do some database work. 
    // Until JDBC drivers updated to handle java.time types, convert to java.sql type. 
    java.sql.Date sqlDate = java.sql.Date.valueOf(localDate); 
    // … do you database work. 

    // Prepare for next iteration of this 'while' loop. 
    localDate = localDate.plusDays(1); 
}