java.time.Instantとjava.sql.Timestampの間で変換
1. 概要
java.time.Instantクラスとjava.sql.Timestamp クラスはどちらも、UTCのタイムライン上のポイントを表します。 つまり、Javaエポック以降のナノ秒数を表します。
このクイックチュートリアルでは、組み込みのJavaメソッドを使用して一方を他方に変換します。
2. InstantをTimestampに変換して元に戻す
Timestamp.from()を使用して、Instantをタイムスタンプに変換できます。
Instant instant = Instant.now();
Timestamp timestamp = Timestamp.from(instant);
assertEquals(instant.toEpochMilli(), timestamp.getTime());
逆に、 Timestamp.toInstant()を使用して、TimestampをInstant s:に変換できます。
instant = timestamp.toInstant();
assertEquals(instant.toEpochMilli(), timestamp.getTime());
いずれにせよ、InstantとTimestampの両方がタイムライン上の同じポイントを表します。
次に、2つのクラスとタイムゾーンの間の相互作用を見てみましょう。
3. toString()メソッドの違い
InstantとTimestampでtoString()を呼び出すと、タイムゾーンに関して動作が異なります。 Instant.toString()は、UTCタイムゾーンで時刻を返します。 一方、 Timezone.toString()は、ローカルマシンのタイムゾーンの時刻を返します。
インスタントとタイムスタンプでそれぞれtoString()を呼び出すと、何が得られるかを見てみましょう。
Instant (in UTC): 2018-10-18T00:00:57.907Z
Timestamp (in GMT +05:30): 2018-10-18 05:30:57.907
ここで、timestamp.toString() によって返された時間の5時間30分後の時間になりました
toString()メソッドの出力は異なりますが、タイムスタンプとインスタントの両方がタイムライン上の同じポイントを表します。
タイムスタンプをUTCタイムゾーンに変換することでこれを確認することもできます。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
formatter = formatter.withZone(TimeZone.getTimeZone("UTC").toZoneId());
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
assertThat(formatter.format(instant)).isEqualTo(df.format(timestamp));
4. 結論
このクイックチュートリアルでは、組み込みメソッドを使用して、 java.time.Instantクラスとjava.sql.TimestampクラスをJavaで変換する方法を説明しました。
また、タイムゾーンが出力の変化にどのように影響するかについても調べました。
そして、いつものように、完全なコード例はGitHubで利用できます。