我使用HSQLDB制作一个小程序(使用JavaFX gui),而我目前正试图获得"预订"部分工作(用户可以添加新的或在有限的时间内搜索现有的)。 为此,我已事先添加了几个日期(我使用的是database.sql脚本),例如:
INSERT INTO reservations(begin, end) VALUES ('2013-08-01', '2013-08-31')
我已经写了一些方法(创建,更新,删除,搜索,查找全部),现在我已经陷入了"创建"一部分。
我想用
将新的预订插入数据库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的方法是否正常?
答案 0 :(得分:1)
而不是(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"完全无关紧要,因为您只看到toString()
的方法java.util.Date
的输出。它与db中的内部状态或存储无关。您的愿望"我希望日期为" YYYY-MM-DD"。"与您的应用程序的表示层相关,而不是与您无法控制的db的内部存储格式相关,除了选择适当的db列类型(此处:ANSI-SQL-DATE)。
在表示层中,您可以使用类似SimpleDateFormat
的类和模式" yyyy-MM-dd"为你想要的输出。
编辑(由于评论中的问题):
好的,你真的不必担心toString()
- java.util.Date
- 时间戳的表示。它的内部状态只是一个很长的代表自1970-01-01以来经过的毫秒数不计算闰秒。只需忽略java.util.Date的标准输出,它会显示系统区域上下文,而不是内部状态。使用a.before(b)
非常合适,与toString()
的奇怪输出无关 - java.util.Date
的方法。
此外:您无法真正控制数据库工具如何显示日期列值。这是您使用的工具的秘密。 db中的内部状态可能完全不同,因此每个db都像一个黑盒子。
但是当您从db读取日期值并将数据呈现给用户时,您必须担心java.util.Date
- 对象的表示。为此,我建议使用SimpleDateFormat
- 见上文。但是这种改编(转换为可读的人类日期格式)不是在db-tool中,不在JDBC层中,而是仅在用户表示层中,通常在UI中。