web-dev-qa-db-ja.com

Java.sql.TimestampをJava 8 ZonedDateTime?

Joda時間をJava 8に移行する

ジョーダ:

UserObject user = new UserObject()
user.setCreatedAt(new DateTime(rs.getTimestamp("columnName")));`

Java 8への移行

これは私のコードです。コンパイルします。それがうまくいくかどうか私は疑わしい:

ZonedDateTime.ofInstant(rs.getTimestamp("columnName").toLocalDateTime().toInstant(ZoneOffset.UTC),ZoneId.of("UTC")));

日付が間違っている場合もあります。何かアドバイス?

9
Parameswar

これは動作するようです:-

ZonedDateTime.ofInstant(rs.getTimestamp("columnname").toInstant(), ZoneId.of("UTC"))
5
Parameswar

tl; dr

履歴の瞬間を追跡するには、クラスメンバー変数の型として Instant を使用します。具体的には、この瞬間は [〜#〜] utc [〜#〜] の日付と時刻と見なされます。

public class UserObject() {
    Instant createdAt ;
    …
    public void setCreatedAt( Instant instantArg ) {
        this.createdAt = instantArg ;
    {
}

現在の瞬間を捉えた使用法。

UserObject user = new UserObject() ;
user.setCreatedAt( Instant.now() ) ;

使用法、データベースから値を入力します。

UserObject user = new UserObject() ;
Instant instant = myResultSet.getObject( "when_created" , Instant.class ) ;
user.setCreatedAt( instant ) ;

JDBC 4.2Instant (UTCの瞬間)のサポートを必要としません。ドライバーがそのクラスをサポートしていない場合は、必要な OffsetDateTime に切り替えます。

UserObject user = new UserObject() ;
OffsetDateTime odt = myResultSet.getObject( "when_created" , OffsetDateTime.class ) ;  
user.setCreatedAt( odt.toInstant() ) ;  // Convert from an `OffsetDateTime` (for any offset-from-UTC) to `Instant` (always in UTC). 

Table of date-time types in Java (both modern and legacy) and in standard SQL.

ユーザーに表示され、ユーザーインターフェイス用にローカライズされています。

user               // Your business object.
.getCreatedAt()    // Returns a `Instant` object.
.atZone(           // Adjust from UTC to a time zone. Same moment, same point on the timeline, different wall-clock time.
    ZoneId.of( "Pacific/Auckland" )  // Specify the user’s desired/expected time zone.
)                  // Returns a `ZonedDateTime` object. 
.format(           // Generate a `String` representing the value of date-time object.
    DateTimeFormatter.ofLocalizedDateTime(
        FormatStyle.FULL   // Specify how long or abbreviated the string.
    )
    .withLocale(   // Specify `Locale` to determine human language and cultural norms for localization.
        Locale.CANADA_FRENCH 
    )
)                  // Returns a `String`.

Locale には何もないタイムゾーンとは直交する問題)があることに注意してください。上記のコードは ニュージーランド に旅行している ケベック のビジネスパーソンの可能性があります。彼女は、周囲の キウイ が使用する実時間を見たいと思っていますが、テキスト表示は母国語のフランス語で読むことを好みます。タイムゾーンとロケールはどちらもプレゼンテーションに任せるのが最善です。通常、UTCを使用するのが最善です。したがって、コードの残りの部分では、メンバー変数createdAtInstantとして定義し、Instantは常にUTCで定義されています。

Java.sql.Timestampを避ける

  • Java.sql.TimestampJava.sql.DateJava.util.Date、およびCalendarはすべて、数年前にJava.timeクラスに取って代わられた、ひどく厄介な古い日時クラスの一部です。
  • Joda-Time も、プロジェクトのサイトのフロントページに記載されているように、Java.timeクラスに取って代わられました。

Java.time

JDBC 4.2 以降では、Java.timeオブジェクトをデータベースと直接交換できます。

Instant

Instantクラスを使用して、現在の瞬間をデータベースに送信します。 Instant クラスは、 [〜#〜] utc [〜#〜] でタイムライン上の瞬間を表し、 ナノ秒 (小数の最大9桁)の分解能で)。

Instant instant = Instant.now() ;  // Capture the current moment in UTC.
myPreparedStatement.setObject( … , instant ) ;

そして検索。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

ZonedDateTime

特定の地域(タイムゾーン)の人々が使用する実時間のレンズを通して同じ瞬間を確認するには、 ZoneId を適用して ZonedDateTime を取得します。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

LocalDateTime is notmoment

.toLocalDateTime()。

LocalDateTimeクラスを特定の瞬間を表すときに使用しないでください。このクラスには、意図的にタイムゾーンやUTCからのオフセットの概念がありません。そのため、それは瞬間を表すことはできません。notタイムライン上のポイントです。約26〜27時間の範囲(タイムゾーンの範囲)に沿ったポテンシャル瞬間)については漠然と考えられます。


Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、 Java.util.Date などの厄介な古い レガシー 日時クラスに取って代わります。 Calendar 、& SimpleDateFormat

Joda-Time プロジェクトが メンテナンスモード になり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracleチュートリアル を参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 31 です。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠した JDBCドライバー を使用してください。文字列は不要で、Java.sql.*クラスは不要です。

Java.timeクラスはどこで入手できますか?

  • Java SE 8Java SE 9Java SE 1 以降
    • ビルトイン。
    • バンドル実装を備えた標準のJava AP​​Iの一部。
    • Java 9では、いくつかのマイナーな機能と修正が追加されています。
  • Java SE 6 および Java SE 7
    • Java.time機能の多くは、 ThreeTen-Backport のJava 6&7にバックポートされています。
  • Android

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明する場です。 IntervalYearWeekYearQuartermore などの便利なクラスがここにあります。

11
Basil Bourque

以下を使用します。

_rs.getTimestamp("columnName").toInstant()
    .atZone(ZoneId.[appropriate-zone-ID-here])
_

地域に適した ZoneId を使用する必要があります(最初に ZoneId.systemDefault() で試すことができます)。

さまざまなJava-Time APIの違いの詳細については、 このすばらしい答え を参照してください。

4