我正在使用 HSQLDB 制作一个小程序(使用 JavaFX gui),目前我正在尝试让“预订”部分正常工作(用户可以在有限的时间内添加新的或搜索现有的)。 为此,我已经事先添加了一些日期(我使用的是database.sql脚本),例如:
INSERT INTO reservations(begin, end) VALUES ('2013-08-01', '2013-08-31')
我已经编写了一些方法(创建、更新、删除、搜索、findAll),现在我有点停留在“创建”部分。
我想将新的预订插入数据库
pstmt = con.prepareStatement("INSERT INTO reservations(begin, end) VALUES (?,?)");
但我在创建可以插入的新日期时遇到问题。
pstmt.setDate(1, (java.sql.Date) beg);
不起作用(我使用 java.util.Date 对象来保存从数据库导出的日期),它只是中止我的测试(jUnit)。
Calendar cal1 = Calendar.getInstance();
cal1.set(2014, 0, 1);
Date beginn = cal1.getTime();
仅创建以下形式的日期:Wed Jan 01 12:23:15 CET 2014
但是(我不知道日期在 HSQLDB 中是如何保存的)我希望日期为“YYYY-MM-DD”。
那么,将日历日期转换为我需要的格式的最佳方法是什么(并对它们进行强制转换?不幸的是,将字符串强制转换为日期不起作用)。并且:如果我要使用 JavaFX 让用户选择开始日期和结束日期,我使用 java.util.Date 日期的方法可以吗?
最佳答案
您应该编写以下内容,而不是导致 (java.sql.Date) beg
导致 ClassCastException
:
new java.sql.Date(beg.getTime()); // provided beg is of type java.util.Date as you wrote
如果您在 VALUES 子句中使用字符串,您可能会考虑 JDBC-escape-syntax对于日期。并且您的声明“仅以以下形式创建日期:Wed Jan 01 12:23:15 CET 2014”根本不重要,因为您只看到 java.util.Date
的方法 toString()
的输出。它与数据库中的内部状态或存储无关。您的愿望“我希望日期为“YYYY-MM-DD”。”与应用程序的表示层相当相关,而不是与数据库的内部存储格式相关,除了选择适当的数据库列类型(此处:ANSI-SQL-DATE)之外,您无法控制数据库的内部存储格式。
在表示层中,您可以使用 SimpleDateFormat
等带有模式“yyyy-MM-dd”的类来获得您想要的输出。
编辑(因为评论中存在问题):
好吧,您真的不需要担心 toString()
表示 java.util.Date
时间戳。它的内部状态只是一个 long 值,代表自 1970-01-01 以来经过的毫秒数,不包括闰秒。只需忽略 java.util.Date 的标准输出,它会显示系统区域上下文,但不会显示内部状态。使用 a.before(b)
是完全可以的,并且与 java.util.Date
的 toString()
方法的奇怪输出无关。
此外:您无法真正控制数据库工具如何显示日期列值。这就是您使用的工具的 secret 。数据库内部的内部状态可能完全不同,因此每个数据库就像一种黑匣子。
但是,当您从数据库读取日期值并将数据呈现给用户时,您必须担心 java.util.Date
对象的表示。为此,我建议使用 SimpleDateFormat
- 参见上文。但这种适应(转换为可读的人类日期格式)不在 db-tool 中,不在 JDBC 层中,而仅在用户表示层中,通常在 UI 中。
关于java - HSQLDB:使用 java 插入/获取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22633195/