LocalDate
をDATE
の列に格納し、そのまま取得します。 DATE
とLocalDate
は両方とも定義によって「ローカル」タイプです。したがって、タイムゾーンのコンセプトは、決して干渉してはなりません。DATEをLocalDateにマップする方法
以下のコードは、インメモリデータベースにDATE
列のテーブルを作成する最小限の例です。 Mavenアーティファクトcom.h2database:h2:1.4.192
はクラスパス内になければなりません。
まず、方法insert
とretrieve
定義:insert
方法は、単一引用符でLocalDate
のtoString
値を使用すること
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");
}
}
お知らせするので、Java™は、タイムゾーンのあいまいさを作成するための機会はありません。そして、次が印刷され
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
それは同じ値を返すようにretrieve
メソッドを記述するためにどのように今insert
一度、その後、別のtimzone設定で数回retrieve
、毎回呼び出しますそれは無条件に、データベーステーブルが変更されないと仮定して挿入されましたか?
あなたはjava.util.Dateをインポートする:ユーザーTunakiにより示唆されるように
java.util.Date
を介した変換は、この質問に概説されていますか?その 'retrieved ='行では、割り当ての左側では完全修飾された 'java.sql.Date'を使用しますが、右側では使用しません。 –3つの同じ「LocalDate」が印刷されることを期待していたのはなぜですか?あなたは '2015-05-20'の日付を挿入しています。次に、デフォルトのタイムゾーンを変更すると、 'java.sql.Date.toLocalDate'メソッドは別の結果を返します。 – Tunaki
@BasilBourque fixed –