を列に格納し、変更せずに取得したいLocalDate
。とはDATE
両方とも、定義上「ローカル」タイプです。したがって、タイムゾーンの概念は決して干渉すべきではありません。DATE
LocalDate
以下のコードは、DATE
メモリ内データベースに列を持つテーブルを作成する最小限の例です。Maven アーティファクト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
このメソッドは単一引用符で囲まれたtoString
値を使用するLocalDate
ため、Java™ がタイムゾーンのあいまいさを作成する機会がないことに注意してください。ここで、毎回異なる timzone 設定で 1insert
回と数回呼び出します。retrieve
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));
}
}
次に、以下が出力されます。
挿入: 2015-05-20 取得日: 2015-05-20 取得日: 2015-05-19 取得日: 2015-05-18
データベーステーブルが変更されないと仮定して、無条件retrieve
に挿入された同じ値を返すようにメソッドを記述する方法は?