使用UCanAccess JDBC驱动程序格式化日期

时间:2014-11-14 20:11:49

标签: java datetime ms-access jdbc ucanaccess

在Java中使用UCanAccess驱动程序时,我发现将日期输出为特定格式非常困难。目前,我正在使用PreparedStatement.setDate()方法,该方法要求日期格式为[yyyy-MM-dd HH:mm:ss]。当用户打开文件时,结果输出也采用这种格式。

编辑* - 我没有使用带有格式化日期的setDate()方法,此方法只接受没有格式化的Java Date对象。我打算写的是我在处理格式化日期时使用setString()方法,但UCanAccess要求此日期字符串格式为[yyyy-MM-dd HH:mm:ss]。我真的只想弄清楚如何在调用setString()之后将其提供给不同的格式或更改格式。

到目前为止一切都很好,但现在我需要提供各种格式的日期文件,例如[MM-dd]。我可以通过使生成的Access字段键入备注或文本来完成此操作,但问题变为当我需要日期为该格式并且仍然将生成的Access字段类型设置为日期/时间时。

我注意到UCanAccess front page,它提到支持访问日期格式,但在几次Google搜索之后,我没有找到任何示例。任何人都知道如何使用此驱动程序格式化日期,同时保持正确的日期/时间类型?

提前致谢!

1 个答案:

答案 0 :(得分:4)

通过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#。但是,你几乎不应该需要在查询中包含日期文字,因为您应该使用带有PreparedStatement参数的.setTimestamp()。)

<强>附录

类似地,将日期/时间值插入Access数据库时:Java中日期/时间值的格式化与日期/时间值在Access中的存储方式没有区别(前提是它被正确解释),它在Access中的显示方式是Access 中格式设置的一个功能。例如,如果我们运行以下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();
}

然后打开Access数据库,将Windows设置为使用&#34;英语(美国)&#34;的默认格式。我们看到

en_us.png

如果我们将Windows中的格式设置更改为&#34;英语(英国)&#34;然后我们看到

en_gb.png

如果我们想要为一个或多个字段使用特定格式,我们需要在Access中使用特定的格式设置,例如,使用类似的内容

DesignView.png

我们看到了

DatasheetView.png