java - 处理结果集中每一行的新日历/日期实例

标签 java date calendar instance resultset

我想获取数据库中保存的多个日期的星期几。

try {
        ResultSet rs = DBHelper.st.executeQuery("SELECT date FROM days ORDER BY date ASC;");
        while (rs.next()) {
            Calendar c = Calendar.getInstance();
            c.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(rs.getString(1)));
            String d = new SimpleDateFormat("EE").format(c.get(Calendar.DAY_OF_WEEK));
            System.out.println(d + ", " rs.getString(1).substring(8));
        }
    } catch(SQLException xc) {xc.printStackTrace();}

我正在为结果集的每一行生成一个新的日历实例,但不知何故,每个日期解析的工作日都是相同的。 日历始终返回与列表中第一个日期匹配的星期几。

例如

Tue, 05 | 
Tue, 06
...

我猜测所有行的日历实例都保持不变。 有人可以建议一种方法来确保 Calendar c 的每一行都更新吗?我的方法似乎并不能解决问题。

最佳答案

    DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("EEE, dd", Locale.ENGLISH);
    try {
        ResultSet rs = DBHelper.st.executeQuery("SELECT date FROM days ORDER BY date ASC;");
        while (rs.next()) {
            LocalDate date = rs.getObject(1, LocalDate.class);
            System.out.println(date.format(dayFormatter));
        }
    } catch (SQLException xc) {
        xc.printStackTrace();
    }

使用 Java 8 和现代 JDBC 驱动程序(JDBC 4.2 或更高版本),您应该能够直接从结果集中获取 LocalDate 对象。 LocalDate 是现代 Java 日期和时间 API java.time 的类之一。

Calendar 类早已过时,而 SimpleDateFormat 不仅如此,它也是出了名的麻烦。我建议您完全避免这些类(class)。

PS 完成后请记住关闭结果集。或者使用try-with-resources .

如果阅读的人使用 Java 6 或 7,则需要进行以下更改:将 ThreeTen Backport 添加到您的项目(下面的链接)。使用其 getDate 方法从结果集中获取 java.sql.Date。使用 DateTimeUtils.toLocalDate 将其转换为 org.thirden.bp.LocalDate。还要从 org. Threeten.bp.format.DateTimeFormatter 导入 DateTimeFormatter

您的代码出了什么问题?

c.get(Calendar.DAY_OF_WEEK) 返回星期几的代码,一个介于 1(星期日)到 7(星期六)之间的 int。当您将此数字传递给 SimpleDateFormat.format(Object) 时,它会被解释为自 Unix 纪元 1970 年 1 月 1 日 0:00 UTC 以来的毫秒数。那天只有几毫秒。那是一个星期四,我从您的代码中得到了 Thu 作为输出,如果您在欧洲/柏林时区或 UTC,我希望您会得到相同的结果。对于 UTC 以西的时区,仍然是星期三,输出将为 Wed。我无法解释你是如何得到 Tue 的,而且我也无法重现这一点。

链接

关于java - 处理结果集中每一行的新日历/日期实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49791832/

相关文章:

java - Morphia 0.110 找不到带有字符串 id 的引用

java - Jersey UnmarshalException JAXB,带有多个 getEntity() 的 XML

java - 如何停止或退出 "Runnable"

java - 如何将 jquery 日历与 jsp 集成

algorithm - 哪个是最好和最简单的日历算法?

java - 如何在 jsf 中使用接缝 validator ?

html - CSS:在打印时隐藏日期 mm/dd/yyyy 占位符

javascript - 有没有办法使用 Moment.js 解析相对日期?

java - 如何格式化打印日历中包含的日期?

angularjs - 如何使用 "controller as"语法通过 AngularJS ui-calendar 获取日历对象?