我正在尝试使用 SimpleDateFormat 和 Calendar 对象修改日期。然后将修改日期写入我的数据库。问题是,我的方法无法编译。它说:不兼容类型字符串无法转换为日期。我错过了什么? 这是我的方法
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
}
最佳答案
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 );
在您的今天
日期中添加天数。
LocalDate expiration = today.plusDays( days ) ;
要生成以标准 ISO 8601 格式 YYYY-MM-DD 表示该值的字符串,只需调用 toString
。
String output = expiration.toString();
2017-01-23
如果您的 JDBC 驱动程序符合 JDBC 4.2 或更高版本,那么您可以通过 PreparedStatement::setObject
和 ResultSet::getObject 与数据库交换此
方法。LocalDate
对于较旧的驱动程序,请使用添加到旧类的新转换方法在 java.sql.Date
类之间进行转换。
java.sql.Date sqlDate = java.sql.Date.valueOf( expiration );
LocalDate expiration = sqlDate.toLocalDate();
提示:将执行业务逻辑(计算到期)的代码与收集输入和显示结果的用户界面工作分开。
关于Java:日期操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43005394/