web-dev-qa-db-ja.com

Joda-TimeをJava.sql.Timestampで使用する方法

準備済みのステートメント があります

INSERT INTO mst(time) VALUES (?);

ここで、時刻は PostgreSQL データベースの Timestamp タイプです。
私は Joda-TimeDateTime オブジェクトを挿入しています。 DateTimeオブジェクトを Java.sql.Timestamp に変換する方法が見つかりません。私はJoda-Timeのドキュメントを読みましたが、これに関する言及はありません。

ありがとう。

62
WolfmanDragon

最初にJoda DateTimeをlong(エポック以降のミリ秒)に変換してから、そこからタイムスタンプを作成できます。

DateTime dateTime = new DateTime();
Timestamp timeStamp = new Timestamp(dateTime.getMillis());
87
Jack Leow

JodaTimeのDateTimeコンストラクターがこれを処理できるようになりました。 (質問が投稿されたときにそれが真実であったかどうかはわかりませんが、それはGoogleの最高の結果なので、新しいソリューションを追加すると思いました。)

いくつかのAPIオプションがあります。

public DateTime(Object instant);
public DateTime(Object instant, DateTimeZone zone);

どちらのオプションもJava.util.Dateを拡張しているためJava.sql.Timestampを受け入れますが、DateTimeとDateはミリ秒の解像度しか持っていないため、ナノ秒は無視されます(固定)。特定のタイムゾーンがない場合、デフォルトでDateTimeZone.UTCになります。

<学習モード>
「解像度」は、提供される桁数です。 「精度」とは、表現がどれほど正確かということです。たとえば、MSSQLのDateTimeの解像度はミリ秒ですが、秒精度は1/3に過ぎません(DateTime2の解像度は可変で高精度です)。
</ Didactic Mode>

ミリ秒解像度のUTCタイムスタンプの例:

new DateTime(resultSet.getTimestamp(1));

データベースでTIMESTAMP WITH TIME ZONEを使用している場合、タイムゾーンをサポートしないため、Java.sql.Timestampは使用できません。 ResultSet#getStringを使用して、文字列を解析する必要があります。

2番目の解像度のタイムゾーンなしのタイムスタンプの例**:

LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
    .parseLocalDateTime(resultSet.getString(1));

2番目の解像度を持つUTCタイムスタンプの例**:

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
    .parseDateTime(resultSet.getString(1));

タイムゾーン付きタイムスタンプ(オフセット形式)、2番目の解像度の例**:

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z")
    .parseDateTime(resultSet.getString(1));

ボーナス:DateTimeFormat#forPatternは、パターンでパーサーを静的にキャッシュするため、必要はありません。

<学習モード>
通常、DBOモデルで文字列を使用して、解決を明示的に行い、中間オブジェクトの生成を回避することをお勧めします。 (2013-11-14 09:55:25は2013-11-14 09:55:25.000と等しいですか?)私は一般に、データ保存に関する最適化のために最適化する「データベースモデルオブジェクト」と、変換/マッピングレイヤーを間に挟んだサービスレベルの使用。 CRUDベースのDAOでビジネスオブジェクトを直接生成すると、優先順位が混ざり合い、どちらにも最適化されず、Edgeのケースを見逃して予期しない場所から例外をスローする傾向があります。明示的な変換レイヤーを使用すると、データソースを制御しない場合など、必要に応じて検証を追加することもできます。懸念事項を分離することにより、各レイヤーを個別にテストすることも容易になります。
</ Didactic Mode>

*ビジネスモデルでナノ秒の解像度に解決する必要がある場合は、別のライブラリを使用する必要があります。

**タイムスタンプ文字列の形式は、データベースによって異なる場合がありますが、確実ではありません。

9
KarlKFI