从 JSpinner 获取日期并放入具有 DATE 格式的 MySQL 数据库列

Posted

技术标签:

【中文标题】从 JSpinner 获取日期并放入具有 DATE 格式的 MySQL 数据库列【英文标题】:Fetching date from JSpinner and putting in MySQL database column having DATE format 【发布时间】:2018-07-14 06:31:44 【问题描述】:

我正在开发一个 java 程序,我希望输入用户的日期。

为此,我使用了 JSpinner 并将其模型类型设置为 Spinner 模型编辑器中的 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


现在,我希望将此日期从用户输入到我的 mysql 数据库列,其数据类型为 DATE。 为此,我尝试了以下方法:- 1.我尝试使用setDate()方法,其参数为dateChosen,其代码如下:-

PreparedStatement stmt = new PreparedStatement();
stmt.setDate (column_no, (java.sql.Date) dateChosen);

但是没有存储日期,并且 MySQL 表的日期列留空。 . 2.我尝试使用setString()方法,其参数为DB_Date,其代码如下:-

 PreparedStatement stmt = new PreparedStatemnt();
 stmt.setString (column_no, DB_Date);

但是,MySQL 表的(日期)列再次留空。

现在,我想知道如何将 JSpinner 中的日期存储到数据类型为 DATE 的 MySQL 表列中。 另外,如果除了使用 JSpinner 将日期存储在 MySQL 表中之外还有其他方法,请告诉我。

【问题讨论】:

【参考方案1】:

JDBC中的Date类型为java.sql.Date,其他情况为java.util.Date,它们不一样,不能直接转换

你可以试试下面的代码

PreparedStatement stmt = new PreparedStatement();
stmt.setDate (column_no, new java.sql.Date(dateChosen.getTime()));

顺便说一句,如果你使用java-8jdbc-4,更合适的方式是使用LocalDate

stmt.setDate (column_no, localDate.now());

【讨论】:

谢谢,第一种方法对我有用。在尝试第二种方法时,我收到错误“不兼容的类型:LocalDate 无法转换为日期” @AlphaSniper 第二个,你可以看看这个***.com/questions/32548331/…【参考方案2】:

java.time

假设您至少可以使用 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 日期和时间API java.time 来完成剩下的工作。

我相信你可以避免老式的SimpleDateFormat 类,不过。做更简单的:

    dateSpinner.setEditor(new JSpinner.DateEditor(dateSpinner, "dd-MM-yyyy"));

最后,由于PreparedStatement 是一个接口,而不是一个类,你不能做你尝试过的事情:

    PreparedStatement stmt = new PreparedStatemnt(); // Nogo; cannot instantiate the type PreparedStatement

这不在这个问题范围内,所以我只提一下你需要一个Connection。我相信您会发现(如果没有,请提出一个新问题)。

【讨论】:

以上是关于从 JSpinner 获取日期并放入具有 DATE 格式的 MySQL 数据库列的主要内容,如果未能解决你的问题,请参考以下文章

从数据库中获取列值(日期)并显示将在一个月后过期的行

将发布在选定选项上的数据库内容放入具有单个字段的表单中

Javascript - 从 HTML 输入中获取日期

如何从 mongodb 获取数据以放入选项中?

我需要从 mysql 数据库中获取日期并打印今天和获取日期之间的差异

如何从我的EditText获取具有格式化日期的日期对象(通过微调器存储)