我想将一个LocalDate存储在DATE列中并保持不变.根据定义,DATE和LocalDate都是“本地”类型.因此,时区的概念不应以任何方式干涉.
下面的代码是一个最小的示例,它在内存数据库中创建一个带有DATE列的表. maven artifact com.h2database:h2:1.4.192必须位于类路径中.
首先,定义方法insert和retrieve:
static void insert(DataSource ds, String date) throws sqlException {
try (Connection conn = ds.getConnection();
Statement stmt = conn.createStatement()) {
stmt.execute("CREATE TABLE people (id BIGINT NOT NULL AUTO_INCREMENT"
+ ", born DATE NOT NULL, PRIMARY KEY (id) );");
stmt.execute("INSERT INTO people (born) VALUES ('" + date + "')");
}
}
static LocalDate retrieve(DataSource ds) throws sqlException {
try (Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM people limit 1")) {
if (rs.next()) {
java.sql.Date retrieved = java.sql.Date.valueOf(rs.getString("born"));
return retrieved.toLocalDate();
}
throw new IllegalStateException("No data");
}
}
请注意,insert方法在单引号中使用LocalDate的toString值,因此Java™没有机会创建时区歧义.现在调用insert一次然后多次检索,每次使用不同的timzone设置:
public static void main(String[] args) throws Exception {
DataSource ds = JdbcConnectionPool.create("jdbc:h2:mem:test", "sa", "sa");
LocalDate born = LocalDate.parse("2015-05-20");
insert(ds, born.toString());
System.out.println("Inserted: " + born);
for (int i : new int[]{-14, 0, 12}) {
TimeZone z = TimeZone.getTimeZone(String.format("Etc/GMT%+02d", i));
TimeZone.setDefault(z);
System.out.println("Retrieved: " + retrieve(ds));
}
}
然后打印以下内容:
Inserted: 2015-05-20 Retrieved: 2015-05-20 Retrieved: 2015-05-19 Retrieved: 2015-05-18
如何编写检索方法,以便它返回无条件插入的相同值,假设数据库表没有更改?
解决方法:
H2 documentation for the DATE Type说是的
The date data type. The format is yyyy-MM-dd.
所以,而不是你…
java.sql.Date retrieved = (java.sql.Date) rs.getobject("born");
return retrieved.toLocalDate();
……我刚刚用过……
return LocalDate.parse(rs.getString("born"));
……我的代码就产生了
Inserted: 2015-05-20
Retrieved: 2015-05-20
Retrieved: 2015-05-20
Retrieved: 2015-05-20
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。