我想获取数据库中保存的多个日期的星期几。
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
的,而且我也无法重现这一点。
链接
- Oracle tutorial: Date Time解释如何使用
java.time
。 - Java Specification Request (JSR) 310 ,其中首次描述了 java.time。
- ThreeTen Backport project ,
java.time
到 Java 6 和 7 的向后移植(对于 JSR-310 为 ThreeTen)。 - ThreeTenABP , Android 版 ThreeTen Backport
- Question: How to use ThreeTenABP in Android Project ,有非常详尽的解释。
关于java - 处理结果集中每一行的新日历/日期实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49791832/