gpt4 book ai didi

java - ResultSet getDate() 返回不正确和正确的日期

转载 作者:太空宇宙 更新时间:2023-11-03 11:23:15 27 4
gpt4 key购买 nike

我正在从假期表中创建 LocalDate 的列表。数据库表中的日期都是正确的,但是当我使用 ResultSet getDate() 方法并用所有日期填充一个列表时,4 个日期是错误的,6 个是正确的。我正在寻找任何帮助来弄清楚为什么会这样。

final LocalDate currentDay = LocalDate.now();
final List<LocalDate> holidays = getHolidays(currentDay);

//This method takes in a date and calculates the holidays that occur that year
public static List<LocalDate> getHolidays(final LocalDate date) {
final List<LocalDate> holidayList = new ArrayList<LocalDate>();

try {
final PreparedStatement holidaysByYearQuery = conn.prepareStatement(
"SELECT fulldate FROM holidays WHERE YEAR(fulldate) = ?");

holidaysByYearQuery.setObject(1, date.getYear());

final ResultSet holidaysByYearResult = holidaysByYearQuery.executeQuery();

while (holidaysByYearResult.next()) {
final Date holidate = (Date) holidaysByYearResult.getObject(1);
final LocalDate holiday = holidate.toLocalDate();
holidayList.add(holiday);
}
} catch (final SQLException e) {
LOGGER.log(Level.WARNING, "Could not query holiday table: " + e.getMessage());
}
return holidayList;
}

// This is the query used in Java:
com.mysql.cj.jdbc.PreparedStatement@1c27c773: SELECT fulldate FROM holidays WHERE YEAR(fulldate) = 2019

// Here is the list that is returned from the method
[2018-12-31, 2019-02-17, 2019-04-19, 2019-05-20, 2019-07-01, 2019-08-05, 2019-09-02, 2019-10-14, 2019-12-24, 2019-12-25]

这里是数据库表信息。这是非常基础的。

CREATE TABLE holidays( 
province VARCHAR(255),
holiday VARCHAR(255),
fulldate DATETIME);

INSERT INTO holidays(province, holiday, fulldate) VALUES
('Ontario', 'New Years', '2019-01-01'),
('Ontario', 'Family Day', '2019-02-18'),
('Ontario', 'Good Friday', '2019-04-19'),
('Ontario', 'Victoria Day', '2019-05-20'),
('Ontario', 'Canada Day', '2019-07-01'),
('Ontario', 'Civic Holiday', '2019-08-05'),
('Ontario', 'Labour Day', '2019-09-02'),
('Ontario', 'Thanksgiving', '2019-10-14'),
('Ontario', 'Christmas Day', '2019-12-25'),
('Ontario', 'Boxing Day', '2019-12-26');

// This is the select result from the query above

+---------------------+
| fulldate |
+---------------------+
| 2019-01-01 00:00:00 |
+---------------------+
| 2019-02-18 00:00:00 |
+---------------------+
| 2019-04-19 00:00:00 |
+---------------------+
| 2019-05-20 00:00:00 |
+---------------------+
| 2019-07-01 00:00:00 |
+---------------------+
| 2019-08-05 00:00:00 |
+---------------------+
| 2019-09-02 00:00:00 |
+---------------------+
| 2019-10-14 00:00:00 |
+---------------------+
| 2019-12-25 00:00:00 |
+---------------------+
| 2019-12-26 00:00:00 |
+---------------------+

如您所见,列表两端的 2 个日期不正确。我假设 getDate() 方法正在发生某些事情。任何人都可以阐明这一点吗?干杯。

最佳答案

为什么要将糟糕的遗留类 Date 与现代的 LocalDate 混在一起?为什么要转换 (Date)

SQL 标准 DATE

如果您的列是类似于 SQL 标准 DATE 的类型,则将 LocalDate 与符合 JDBC 4.2 或更高版本的 JDBC 驱动程序一起使用。

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

SQL 标准 TIMESTAMP WITH TIME ZONE

如果您的列的类型类似于 SQL 标准 TIMESTAMP WITH TIME ZONE,那么您必须考虑时区以确定日期。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZoneId z = ZoneId.of( "Australia/Sydney" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
LocalDate ld = zdt.toLocalDate() ;

SQL 标准 TIMESTAMP WITHOUT TIME ZONE

如果您的列是类似于 SQL 标准 TIMESTAMP WITHOUT TIME ZONE 的数据类型,例如 MySQL 类型 DATETIME,请使用 Java 类型 LocalDateTime 。这种类型只有日期和时间,没有时区或与 UTC 的偏移量。所以这种类型表示片刻。

LocalDateTime ldt = myResultSet.getObject( … , OffsetDateTime.class ) ;
LocalDate ld = ldt.toLocalDate() ;

Table listing date-time types in Java (both modern & legacy) and in standard SQL.

关于java - ResultSet getDate() 返回不正确和正确的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57204395/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com