66

私は準備された声明を持っています

INSERT INTO mst(time) VALUES (?);

time は、PostgreSQLデータベースのTimestamp型です。Joda-Time のDateTimeオブジェクト を挿入しています。または挿入しようとしていると言うべきです。DateTime オブジェクトをjava.sql.Timestampに変換する方法が見つかりません。Joda-Time のドキュメントを読んだことがありますが、これに関する参照はありません。

ありがとう。

4

2 に答える 2

90

最初に Joda DateTime を long (エポックからのミリ秒) に変換してから、そこから Timestamp を作成できます。

DateTime dateTime = new DateTime();
Timestamp timeStamp = new Timestamp(dateTime.getMillis());
于 2009-07-01T23:31:20.530 に答える
10

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 の分解能は可変で、精度はより高くなります)。
</教訓モード>

ミリ秒単位の 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 を使用すると、優先順位が混同され、どちらにも最適化されず、エッジ ケースを逃したために予期しない場所から例外がスローされる傾向があることがわかりました。明示的な変換レイヤーを使用すると、データ ソースを制御しない場合など、必要に応じて検証を追加することもできます。
</教訓モード>

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

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

于 2013-11-14T19:35:25.927 に答える