我正在开发Java程序,希望输入用户的日期。
为此,我使用了JSpinner,并在Spinner Model Editor中将其模型类型设置为 Date 。
另外,默认情况下,微调器还显示时间,并且我不想显示时间,而是仅显示日期,因此,我创建了一个新的 SimpleDateFormat 并将其应用于微调器。
这是SimpleDateFormat的代码:-
SimpleDateFormat date_format = new SimpleDateFormat("dd-MM-yyyy");
dateSpinner.setEditor(new JSpinner.DateEditor(dateSpinner,date_format.toPattern()));
我使用DateFormat是因为我想以 dd-mm-yyyy 格式显示日期。
此后,我使用 stateChanged方法来通过JSpinner获取用户选择的日期。
方法的主体如下:-
private void stateChanged(javax.swing.event.ChangeEvent evt) {
Date dateChosen = (Date) dateSpinner.getValue();
int date = dateChosen.getDate();
int month = ( dateChosen.getMonth() ) + 1;
int year = ( dateChosen.getYear() ) + 1900;
String DB_Date = String.valueOf(year) + "-" + String.valueOf(month) + "-" + String.valueOf(date);
// 1 was added to **month** because month's were 1 less than the conventional human format
// also, 1900 was added to **year** to make it suitable for apperance of human conventions
}
现在,我希望将此日期从用户输入到数据类型为 DATE 的MySQL数据库列中。
为此,我尝试了以下方法:-
1.我尝试使用 setDate()方法,其参数为 dateChosen ,其代码如下:-
PreparedStatement stmt = new PreparedStatement();
stmt.setDate (column_no, (java.sql.Date) dateChosen);
但是,日期没有存储,MySQL表的date列留空。
。
2.我尝试使用 setString()方法,其参数为 DB_Date ,其代码如下:-
PreparedStatement stmt = new PreparedStatemnt();
stmt.setString (column_no, DB_Date);
但是,MySQL表的[date]列再次留空。
现在,我想知道如何将JSpinner中的日期存储到数据类型为 DATE 的MySQL表列中。
另外,如果除了使用JSpinner将日期存储在MySQL表中之外,还有其他方法,请也告诉我。
答案 0 :(得分:1)
Date
中的JDBC
类型为java.sql.Date
,在其他情况下为java.util.Date
,它们不一样,不能直接转换
您可以尝试以下代码
PreparedStatement stmt = new PreparedStatement();
stmt.setDate (column_no, new java.sql.Date(dateChosen.getTime()));
顺便说一句,如果您使用的是java-8
和jdbc-4
,则更合适的方法是使用 LocalDate
stmt.setDate (column_no, localDate.now());
答案 1 :(得分:0)
假设您至少可以使用Java 8和至少JDBC 4.2:
LocalDate dateToSave = dateChosen.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
stmt.setObject(column_no, dateToSave);
不要将日期另存为字符串到MySQL。使用日期对象。当然,与有问题的设计早已过时的LocalDate
相比,它更喜欢现代的java.sql.Date
。请注意使用setObject()
而不是setDate()
。
在这里,我们无法完全避免使用老式的java.util.Date
类,因为微调器给了我们一个(您可能想研究是否可以将LocalDate
对象填充到微调器中,但这不是我的主场,我不知道)。在这种情况下,要做的第一件事是将Date
转换为现代的Instant
类,这样我们就可以使用java.time
(现代的Java日期和时间API)完成其余的工作。
不过,我相信您 可以避免使用老式的SimpleDateFormat
类。只需简单一些即可:
dateSpinner.setEditor(new JSpinner.DateEditor(dateSpinner, "dd-MM-yyyy"));
最后,由于PreparedStatement
是一个接口,而不是一个类,因此您无法做您尝试做的事情:
PreparedStatement stmt = new PreparedStatemnt(); // Nogo; cannot instantiate the type PreparedStatement
这个问题不在此范围内,因此我只想提一下您需要一个Connection
。我相信您会发现(如果没有,请问一个新问题)。