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")));
日付が間違っている場合もあります。何かアドバイス?
これは動作するようです:-
ZonedDateTime.ofInstant(rs.getTimestamp("columnname").toInstant(), ZoneId.of("UTC"))
履歴の瞬間を追跡するには、クラスメンバー変数の型として 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.2 は Instant
(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).
ユーザーに表示され、ユーザーインターフェイス用にローカライズされています。
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を使用するのが最善です。したがって、コードの残りの部分では、メンバー変数createdAt
をInstant
として定義し、Instant
は常にUTCで定義されています。
Java.sql.Timestamp
を避けるJava.sql.Timestamp
、Java.sql.Date
、Java.util.Date
、およびCalendar
はすべて、数年前に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 8以降に組み込まれています。これらのクラスは、 Java.util.Date
などの厄介な古い レガシー 日時クラスに取って代わります。 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクトが メンテナンスモード になり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracleチュートリアル を参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 31 です。
Java.timeオブジェクトをデータベースと直接交換できます。 JDBC 4.2 以降に準拠した JDBCドライバー を使用してください。文字列は不要で、Java.sql.*
クラスは不要です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明する場です。 Interval
、 YearWeek
、 YearQuarter
、 more などの便利なクラスがここにあります。
以下を使用します。
_rs.getTimestamp("columnName").toInstant()
.atZone(ZoneId.[appropriate-zone-ID-here])
_
地域に適した ZoneId
を使用する必要があります(最初に ZoneId.systemDefault()
で試すことができます)。
さまざまなJava-Time APIの違いの詳細については、 このすばらしい答え を参照してください。