java.time
2014年3月のJavaSE8のリリースにより、古くてエラーが発生しやすいレガシーDate-Time API(java.util
日時タイプとそのフォーマットタイプ、SimpleDateFormat
など)はjava.time
に置き換えられました 、最新の日時API。 次の表
java.time
を使用したANSISQLタイプのマッピングを示しています タイプ:
ANSI SQL | Java SE 8 |
---|---|
日付 | LocalDate |
時間 | LocalTime |
タイムスタンプ | LocalDateTime |
TIME WITH TIMEZONE | ResetTime |
タイムスタンプ付きタイムスタンプ | ResetDateTime |
ZonedDateTime
に注意してください およびInstant
JDBCドライバーではサポートされていませんが、一部のドライバー(例: PostgreSQLはOffsetTime
もサポートしていません / TIME [ WITHOUT TIMEZONE ]
。また、すべてのOffsetDateTime
インスタンスはUTCである必要があります(オフセット0)。これは、バックエンドがそれらをUTCとして保存するためです。
JDBCでの使用方法は?
以下に、現在のOffsetDateTime
を挿入するためのサンプルコードを示します。 UTCで、columnfoo
に (これはTIMESTAMP WITH TIMEZONE
タイプ):
OffsetDateTime odt = Instant.now().atOffset(ZoneOffset.UTC);
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, odt);
st.executeUpdate();
st.close();
Instant
タイムライン上の瞬間的なポイントを表し、タイムゾーンに依存しません。つまり、+00:00
のタイムゾーンオフセットがあります。 時間。
以下に、OffsetDateTime
を取得するためのサンプルコードを示します。 columnfoo
から :
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE <some condition>");
while (rs.next()) {
// Assuming the column index of columnfoo is 1
OffsetDateTime odt = rs.getObject(1, OffsetDateTime.class));
System.out.println(odt);
}
rs.close();
st.close();
OffsetDateTime
を変換する必要がある場合に備えて オフセットが異なる別のものに:
これを行うにはいくつかの方法がありますが、私は主に OffsetDateTime#withOffsetSameInstant
、OffsetDateTime
を変換します タイムゾーンオフセットが異なる別のタイムゾーンに変換します。例:
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
// A sample OffsetDateTime in UTC.
OffsetDateTime odt = Instant.now().atOffset(ZoneOffset.UTC);
System.out.println(odt);
OffsetDateTime offsetTimeAtOffset0100 = odt.withOffsetSameInstant(ZoneOffset.of("+02:00"));
System.out.println(offsetTimeAtOffset0100);
// Time at JVM's default timezone offset
ZoneOffset jvmTzOffset = ZonedDateTime.now(ZoneId.systemDefault()).getOffset();
OffsetDateTime offsetTimeAtJvmTzOffset = odt.withOffsetSameInstant(jvmTzOffset);
System.out.println(offsetTimeAtJvmTzOffset);
}
}
出力:
2021-05-29T13:36:15.258076Z
2021-05-29T15:36:15.258076+02:00
2021-05-29T14:36:15.258076+01:00
上記のコードに関連するいくつかのポイント:
-
Z
出力には、タイムゾーン指定子 が含まれています。 ゼロタイムゾーンオフセットの場合。 Zuluの略で、Etc/UTC
を指定します。 タイムゾーン(+00:00
のタイムゾーンオフセットがあります 時間)。 - コードは
odt
を変換しますOffsetDateTime
の2つのインスタンスに -それぞれ異なる方法で。最初のインスタンスは、+02:00
の固定タイムゾーンオフセットです。 2つ目は、JVMのタイムゾーンオフセットを使用します。 DST を監視している場所のタイムゾーンオフセットに注意してください。 夏/冬時間に応じて変化します。したがって、場所がDSTを監視している場合、固定のタイムゾーンオフセットを使用する代わりに、+02:00
時間; APIから取得する必要があります。 - 私のJVMのタイムゾーンは
Europe/London
現在、そのオフセットは+01:00
です。 時間。
最新の日時API Trail:DateTime から 。