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

ksm*_*ark 5 java ms-access datetime 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首页上,它提到支持访问日期格式,但我在几次谷歌搜索后没有找到任何示例.任何人都知道如何使用此驱动程序格式化日期,同时保持正确的日期/时间类型?

提前致谢!

Gor*_*son 5

当您通过 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)));
}
Run Code Online (Sandbox Code Playgroud)

给我们

         "raw" value (via .toString()): 2014-01-23 00:00:00.0
formatted value (via SimpleDateFormat): 01-23
Run Code Online (Sandbox Code Playgroud)

(请注意,当 UCanAccess 页面谈到“访问日期格式”时,它指的是包含在哈希标记中的日期/时间文字,如下所示:#11/22/2003 10:42:58 PM#。但是,您几乎不需要在查询中包含日期文字,因为您应该使用aPreparedStatement带有适当的.setTimestamp()参数。)

附录

类似地,当将日期/时间值插入 Access 数据库时:Java 中日期/时间值的格式对日期/时间值在 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();
}
Run Code Online (Sandbox Code Playgroud)

然后在Windows设置为使用默认格式“英语(美国)”的情况下打开Access数据库,我们看到

en_us.png

如果我们将 Windows 中的格式设置更改为“英语(英国)”,那么我们会看到

en_gb.png

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

设计视图.png

我们看

数据表视图.png