2017-03-24 131 views
0

我想使用SimpleDateFormat和Calendar對象修改日期。然後將修改日期寫入我的數據庫。問題是,我的方法不會編譯。它說:不兼容的類型字符串不能轉換爲日期。我錯過了什麼? 這是我的方法Java:日期操作

public Date expiredItem() { 

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    Calendar expiredDate = Calendar.getInstance(); 
    expiredDate.add(Calendar.DATE, Integer.parseInt(timeFld.getText())); 
    //timeFld is JTextField.getText() casted into int 

    // The confusing thing is, below Dialog works as i expected but not on my 
    // method return. 
    JOptionPane.showMessageDialog(null, "Expiration Date: " +  
    dateFormat.format(expiredDate.getTime())); 
    return dateFormat.format(expiredDate.getTime()); //Erroneous code 
} 
+0

我剛剛發現我的回報語句字符串,但我的方法返回日期。但我該如何解決這個問題,讓我的方法返回formattedDate? –

+1

如果你只是想獲得類型的對象'java.util.Date'然後返回'expiredDate.getTime());'就這麼簡單。無需在此格式化。或者,如果你想要一個字符串然後格式化並改變方法的返回類型。 –

+0

將返回類型的方法更改爲字符串? –

回答

1

TL;博士

myPreparedStatement.setObject( 
    … , 
    LocalDate.now(ZoneId.of("America/Montreal")) 
      .plusDays(…) 
) 

詳細

問題尚不清楚,但它聽起來就像你正試圖獲取當前日期,添加天的一些數(以文本形式輸入)以確定「到期」日期,並將其顯示爲文本。

您正在使用令人困惑的舊日期時間類,它們現在已經成爲遺留問題,並被java.time類取代。

獲取當前日期需要一個時區。對於任何特定的時刻,日期在全球各地按照地區而不同。

ZoneId z = ZoneId.of("America/Montreal"); 

您可以使用JVM的當前默認時區。但是要知道,默認值可以隨時通過JVM中任何應用程序的任何線程中的任何代碼進行更改。因此,如果至關重要,請向用戶詢問所需的/預期的區域。

ZoneId z = ZoneId.systemDefault() ; 

爲了表示沒有時間的天,沒有一個時區的日期,只值,使用LocalDate

LocalDate today = LocalDate.now(z); 

解析天數文本爲long

String input = timeFld.getText() ; 
long days = Long.parseLong(input); 

將天添加到您的today日期。

LocalDate expiration = today.plusDays(days) ; 

,以產生表示在標準ISO 8601格式YYYY-MM-DD該值的​​字符串,只需調用toString

String output = expiration.toString(); 

2017年1月23日

如果你的JDBC驅動程序與JDBC 4.2或更高版本的規定,那麼你可以通過PreparedStatement::setObjectResultSet::getObject方法交換這LocalDate與您的數據庫。

對於較舊的驅動程序,使用添加到舊類新的轉換方法轉換到/從java.sql.Date類。

java.sql.Date sqlDate = java.sql.Date.valueOf(expiration); 

LocalDate expiration = sqlDate.toLocalDate(); 

提示:分隔碼做業務邏輯(計算期滿)從收集輸入和顯示結果的用戶界面的工作。

+0

它的工作原理,謝謝 –