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

在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上注意到,它提到了支持Access日期格式的信息,但是在几次Google搜索之后,我找不到任何示例。有人知道如何使用此驱动程序设置日期格式,同时保持正确的日期/时间类型吗?

提前致谢!

参考方案

通过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()。)

附录

同样,将Date / Time值插入Access数据库时:Java中Date / Time值的格式与Access中存储Date / Time值的方式(假设正确解释)的方式没有区别。它在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();
}

然后打开Windows,将Access数据库设置为使用“英语(美国)”的默认格式

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

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

我们看

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java Scanner读取文件的奇怪行为 - java

因此,在使用Scanner类从文件读取内容时,我遇到了一个有趣的问题。基本上,我试图从目录中读取解析应用程序生成的多个输出文件,以计算一些准确性指标。基本上,我的代码只是遍历目录中的每个文件,并使用扫描仪将其打开以处理内容。无论出于何种原因,扫描程序都不会读取其中的一些文件(所有UTF-8编码)。即使文件不是空的,scanner.hasNextLine()在…

Java Globbing模式以匹配目录和文件 - java

我正在使用递归函数遍历根目录下的文件。我只想提取*.txt文件,但不想排除目录。现在,我的代码如下所示:val stream = Files.newDirectoryStream(head, "*.txt") 但是这样做将不会匹配任何目录,并且返回的iterator()是False。我使用的是Mac,所以我不想包含的噪音文件是.DS_ST…

直接读取Zip文件中的文件-Java - java

我的情况是我有一个包含一些文件(txt,png,...)的zip文件,我想直接按它们的名称读取它,我已经测试了以下代码,但没有结果(NullPointerExcepion):InputStream in = Main.class.getResourceAsStream("/resouces/zipfile/test.txt"); Buff…

Java RegEx中的单词边界\ b - java

我在使用\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)\binsert\b");找不到匹配项Pattern insPtrn = Pattern.compile(&…