gpt4 book ai didi

java - 使用 H2 数据库的 JDBC 中的年份从负 -509 变为正 510

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:04:42 24 4
gpt4 key购买 nike

-509 对比 510

我看到使用 JDBC 时发生了某种更改或错误的数据。所以我观察使用 H2 Database Java 8 更新 151 上的版本 1.4.196。

这是一个完整的例子。

请注意我们如何检索日期值三次,第一次作为 LocalDate 对象,第二次作为文本,第三次作为从转换 中提取的 int 年份数字>LocalDate 对象。在文字版中我们可以看到年份确实是负数。奇怪的是,LocalDate 有一个不同的年份,它是正数而不是负数。似乎是一个错误。

private void doIt ( )
{
System.out.println( "BASIL - Running doIt." );
try
{
Class.forName( "org.h2.Driver" );
} catch ( ClassNotFoundException e )
{
e.printStackTrace( );
}

try (
Connection conn = DriverManager.getConnection( "jdbc:h2:mem:" ) ; // Unnamed throw-away in-memory database.
)
{
conn.setAutoCommit( true );
String sqlCreate = "CREATE TABLE history ( id IDENTITY , when DATE ); ";
String sqlInsert = "INSERT INTO history ( when ) VALUES ( ? ) ; ";
String sqlQueryAll = "SELECT * FROM history ; ";

PreparedStatement psCreate = conn.prepareStatement( sqlCreate );

psCreate.executeUpdate( );

PreparedStatement psInsert = conn.prepareStatement( sqlInsert );

psInsert.setObject( 1 , LocalDate.of( 2017 , 1 , 23 ) );
psInsert.executeUpdate( );

psInsert.setObject( 1 , LocalDate.of( -509 , 1 , 1 ) );
psInsert.executeUpdate( );

PreparedStatement psQueryAll = conn.prepareStatement( sqlQueryAll );
ResultSet rs = psQueryAll.executeQuery( );
while ( rs.next( ) )
{
long l = rs.getLong( 1 ); // Identity column.
// Retrieve the same date value in three different ways.
LocalDate ld = rs.getObject( 2 , LocalDate.class ); // Extract a `LocalDate`, and implicitly call its `toString` method that uses standard ISO 8601 formatting.
String s = rs.getString( 2 ); // Extract the date value as text from the database using the database-engine’s own formatting.
int y = ( ( LocalDate ) rs.getObject( 2 , LocalDate.class ) ).getYear( ); // Extract the year number as an integer from a `LocalDate` object.
String output = "ROW: " + l+ " | " + ld + " | when as String: " + s+ " | year: " + y ;
System.out.println( output );
}

conn.close( );
} catch ( SQLException e )
{
e.printStackTrace( );
}
}

运行时。

ROW: 1 | 2017-01-23 | when as String: 2017-01-23 | year: 2017

ROW: 2 | 0510-01-01 | when as String: -509-01-01 | year: 510

所以似乎有一些事情与 JDBC 有关。请注意年份是如何显示为正 510 而不是负 509。我不理解这种行为。

我可以推断这是 JDBC 中的一个问题而不是在 LocalDate 内.看这个example code run live in IdeOne.com显示 LocalDate 对象确实携带并报告负年份。

LocalDate ld = LocalDate.of( -509 , 1 , 1 ) ;
System.out.println( "ld.toString(): " + ld ) ;
System.out.println( "ld.getYear(): " + ld.getYear() ) ;

请注意,在仅处理 LocalDate 而没有 JDBC 时,我们如何将 -509 转换为 510。

ld: -0509-01-01

ld.getYear(): -509

我打开了一个Issue ticket 在 H2 项目上。

最佳答案

问题是由java.sql.Date的转换引起的至 LocalDate.因为这是负数年,Calendar保存获取结果的实例会将 year 转换为 1 - year 但在转换为 LocalDate 时java 没有考虑表明 year < 0 的附加信息 (era==BC)下面是在返回结果之前执行的 final方法。 enter image description here

试试这个:

public class Test {
public static void main(String[] args) {

Calendar instance = Calendar.getInstance();
instance.set(-509,1,1);

java.sql.Date d = new Date(instance.getTime().getTime());

System.out.println(d.toLocalDate().getYear());// 510


}
}

谢谢 Ole V.V.征求意见!!!

关于java - 使用 H2 数据库的 JDBC 中的年份从负 -509 变为正 510,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46839689/

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