tl; dr
最新のjava.timeクラスのみを使用してください。以下のようなひどいレガシークラスを使用しないでくださいSimpleDateFormat
、Date
またはjava.sql.Timestamp
。
ZonedDateTime // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now( // Capture the current moment.
ZoneId.of( "Africa/Tunis" ) // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` object containing text representing the value of our date-time object.
DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
) // Returns a `String`.
または、JVMの現在のデフォルトのタイムゾーンを使用します。
ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )
java.timeおよびJDBC 4.2
上記のように、最新のアプローチではjava.timeクラスを使用します。
JDBCドライバーがJDBC 4.2に準拠している場合は、java.timeオブジェクトをデータベースと直接交換できます。とを使用PreparedStatement::setObject
しResultSet::getObject
ます。
JDBC 4.2より前のドライバーに対してのみjava.sqlを使用してください
JDBCドライバーがjava.time型のサポートについてJDBC 4.2にまだ準拠していない場合は、java.sqlクラスの使用にフォールバックする必要があります。
データの保存。
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;
データを取得しています。
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
などのjava.sqlタイプjava.sql.Timestamp
は、データベースとの間の転送にのみ使用する必要があります。Java 8以降では、すぐにjava.time型に変換します。
java.time.Instant
A java.sql.Timestamp
はjava.time.Instant
、UTCのタイムライン上の瞬間にマッピングされます。toInstant
古いクラスに追加された新しい変換メソッドに注意してください。
java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant();
タイムゾーン
希望する/期待されるタイムゾーン(ZoneId
)を適用してを取得しZonedDateTime
ます。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
書式設定された文字列
a DateTimeFormatter
を使用して文字列を生成します。パターンコードは似ていますがjava.text.SimpleDateFormat
正確ではありませんので、ドキュメントをよく読んでください。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
この特定の形式は、UTCからのオフセットやタイムゾーンの表示がないため、その正確な意味が曖昧です。
ISO 8601
この件に関して発言がある場合は、独自の形式を採用するのではなく、標準のISO 8601形式を使用することをお勧めします。標準フォーマットはあなたのフォーマットに非常に似ています。例:
2016-02-20T03:26:32+05:30
。
java.timeクラスはデフォルトでこれらの標準形式を使用するため、パターンを指定する必要はありません。ZonedDateTime
クラスは、タイムゾーン(賢明な改善)の名前を追加することによって、標準的なフォーマットを拡張します。
String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]
java.sqlに変換
java.timeからに変換できjava.sql.Timestamp
ます。Instant
からを抽出しZonedDateTime
ます。
古いクラスに新しいメソッドが追加され、java.timeクラスとの変換が容易になりました。
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
java.timeについて
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.Date
、Calendar
、& SimpleDateFormat
。
ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。
詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。