当您通过UCanAccess检索日期/时间字段值时,您会获得一个
java.sql.Timestamp
对象。它包含了日期/时间的值,但它本身并没有一个格式。
如果您想以特定的方式
表示该日期/时间值,只需将其格式化为您喜欢的方式即可。最简单的方法可能是使用
java.text.SimpleDateFormat
。例如:
try (ResultSet rs = s.executeQuery("SELECT DateJoined FROM Members WHERE MemberID=1")) {
rs.next();
System.out.printf(
" \"raw\" value (via .toString()): %s%n",
rs.getTimestamp(1).toString());
SimpleDateFormat mmddFormat = new SimpleDateFormat("MM-dd");
System.out.printf(
"formatted value (via SimpleDateFormat): %s%n",
mmddFormat.format(rs.getTimestamp(1)));
}
给我们
"raw" value (via .toString()): 2014-01-23 00:00:00.0
formatted value (via SimpleDateFormat): 01-23
请注意,当UCanAccess页面谈到“访问日期格式”时,它是指用井号括起来的日期/时间文字,如:
#11/22/2003 10:42:58 PM#
。然而,几乎永远不需要在查询中包含日期文字,因为您应该使用带有适当
.setTimestamp()
参数的
PreparedStatement
。
附言
同样地,向访问数据库插入日期/时间值时,Java中日期/时间值的格式对于访问中存储的日期/时间值没有影响(只要它被正确解释),而它在访问中显示的方式是一个反映在访问设置中的函数。例如,如果我们运行以下Java代码:
try (Statement s = conn.createStatement()) {
s.executeUpdate(
"INSERT INTO tblDates " +
"(ID, mmddyyyy) " +
"VALUES " +
"('literal', #12/25/2014#)"
);
}
SimpleDateFormat mmddyyyyFormat = new SimpleDateFormat("MM/dd/yyyy");
Timestamp mmddyyyyXmas =
new Timestamp(mmddyyyyFormat.parse("12/25/2014").getTime());
SimpleDateFormat ddmmyyyyFormat = new SimpleDateFormat("dd/MM/yyyy");
Timestamp ddmmyyyyXmas =
new Timestamp(ddmmyyyyFormat.parse("25/12/2014").getTime());
SimpleDateFormat yyyymmddFormat = new SimpleDateFormat("yyyy/MM/dd");
Timestamp yyyymmddXmas =
new Timestamp(yyyymmddFormat.parse("2014/12/25").getTime());
try (PreparedStatement ps = conn.prepareStatement(
"INSERT INTO tblDates " +
"(ID, mmddyyyy, ddmmyyyy, yyyymmdd) " +
"VALUES " +
"('parameters', ?, ?, ?)"
)) {
ps.setTimestamp(1, mmddyyyyXmas);
ps.setTimestamp(2, ddmmyyyyXmas);
ps.setTimestamp(3, yyyymmddXmas);
ps.executeUpdate();
}
然后使用 Windows 默认的 "英语(美国)" 格式打开 Access 数据库,我们可以看到:
![en_us.png](https://istack.dev59.com/Bxujw.webp)
如果我们在 Windows 中更改格式设置为 "英国英语",则会看到:
![en_gb.png](https://istack.dev59.com/sdjyi.webp)
如果我们想要为一个或多个字段使用特定的格式,则需要在 Access 中使用特定的格式设置,例如像这样:
![DesignView.png](https://istack.dev59.com/DZa5Q.webp)
我们可以看到:
PreparedStatement.setDate()
需要一个java.sql.Date
参数,该参数没有格式(也不用于执行“输出”)。 - user330315setString()
来处理日期,应该使用setDate()
。日期的格式化应该在前端显示(读取)数据时处理,而不是在保存数据时处理。 - user330315