2017-03-24 82 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

它的工作原理,谢谢 –