1. 概要

java.time.Instantクラスとjava.sql.Timestamp クラスはどちらも、UTCのタイムライン上のポイントを表します。 つまり、Javaエポック以降のナノ秒数を表します。

このクイックチュートリアルでは、組み込みのJavaメソッドを使用して一方を他方に変換します。

2. InstantTimestampに変換して元に戻す

Timestamp.from()を使用して、Instantをタイムスタンプに変換できます。

Instant instant = Instant.now();
Timestamp timestamp = Timestamp.from(instant);
assertEquals(instant.toEpochMilli(), timestamp.getTime());

逆に、 Timestamp.toInstant()を使用して、TimestampInstant s:に変換できます。

instant = timestamp.toInstant();
assertEquals(instant.toEpochMilli(), timestamp.getTime());

いずれにせよ、InstantTimestampの両方がタイムライン上の同じポイントを表します。

次に、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分後の時間になりました Instant.toString()。 これは、ローカルマシンのタイムゾーンがGMT+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利用できます。