java.time.Instantとjava.sql.Timestampの間の変換
1.概要
java.time.Instant
クラスと
java.sql.Timestamp
クラスはどちらも、UTCのタイムライン上のポイントを表します。つまり、https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html[Javaエポック]以降のナノ秒数を表します。
このクイックチュートリアルでは、組み込みのJavaメソッドを使用して、互いに変換します。
2.
Instant
を
Timestamp
に変換して戻る
-
__Instant
sをタイムスタンプに変換するために
Timestamp.from()__を使うことができます。
Instant instant = Instant.now();
Timestamp timestamp = Timestamp.from(instant);
assertEquals(instant.toEpochMilli(), timestamp.getTime());
逆も同様ですが、
Timestamp.toInstant()
を使用して
__Timestamp
sを
Instant
__sに変換できます。
instant = timestamp.toInstant();
assertEquals(instant.toEpochMilli(), timestamp.getTime());
どちらの方法でも、
Instant
と
Timestamp
の両方がタイムライン上の同じポイントを表します。
次に、2つのクラスとタイムゾーンの間の相互作用を見てみましょう。
3.
toString()
メソッドの違い
-
Instant
と
Timestamp
で
toString()
を呼び出すと、タイムゾーンとは動作が異なります。**
Instant.toString()
は、UTCタイムゾーンで時刻を返します。一方、
Timezone.toString()
は、ローカルマシンのタイムゾーンの時刻を返します。
それぞれ
instant
と
timezone
で
toString()
を呼び出したときに得られる結果を見てみましょう。
Instant (in UTC): 2018-10-18T00:00:57.907Z
Timestamp (in GMT +05:30): 2018-10-18 05:30:57.907
Here、timestamp.toString()
は、__instant.toString()によって返された時間から5時間30分経過した時間をもたらしました。
-
toString()
メソッドの出力は異なりますが、
timestamp
と
instant
の両方がタイムライン上の同じポイントを表します** 。
これを検証するには、
Timestamp
をUTCタイムゾーンに変換します。
DateFormat df = DateFormat.getDateTimeInstance();
df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SS'Z'");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
assertEquals(instant.toString(), df.format(timestamp).toString());
4.まとめ
このクイックチュートリアルでは、組み込みメソッドを使用して、Javaで
java.time.Instant
クラスと
java.sql.Timestamp
クラスの間で変換する方法を見ました。
また、タイムゾーンが出力の変化にどのように影響するかを調べました。
そして、いつものように、完全なコード例はhttps://github.com/eugenp/tutorials/tree/master/java-dates[GitHubで利用可能]です。