0

Java の文字列の日付値を日付に変換し、それを mysql テーブルに保存しようとしています。

コードスニペットの下:

DateFormat dfm = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
String string = "07/24/2013 17:57:52 UTC";
Date a = dfm.parse(string);
System.out.println(a);

私の問題は、上記のコードが常に次のコンソール出力を返すことです: Wed Jul 24 17:57:52 PDT 2013

タイムゾーンが変更される理由はわかりません。これをデータベースに入れようとすると、「2013-07-24 17:57:52」形式で保存されます。上記のコードが PDT でタイムゾーンを返す理由がわかりません。

皆さん、私にそれを説明してもらえますか? 私の意図は、入力として来る UTC 日付を保存し、それを MySQL タイムスタンプ フィールドに保存することです。

前もって感謝します。

4

2 に答える 2

1

そうですね、タイム ゾーンを含めないように文字列を修正できれば、より簡単になります。まず、Dateオブジェクトにはタイム ゾーンがまったく含まれていないことを理解する必要があります。タイム ゾーンは単なるポイント イン タイムです。

次に、UTC で指定された日付/時刻を解析しようとしているので、次のように設定する必要がありますSimpleDateFormat

DateFormat dfm = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
dfm.setTimeZone(TimeZone.getTimeZone("UTC"));

その時点で、JPAが正しいことをしてくれることを願っています。少なくとも正しい値をコンストラクターに渡します。Timestamp

ただし、MySQL ドキュメントの次の部分は私を不安にさせます。

MySQL は、保存のために TIMESTAMP 値を現在のタイム ゾーンから UTC に変換し、取得のために UTC から現在のタイム ゾーンに戻します。(これは、DATETIME などの他の型では発生しません。)

DATETIMEこのタイム ゾーンの変換を停止するには、代わりにフィールドを使用することをお勧めします。接続のタイム ゾーンを UTC に設定すると、保存時に役立ちますが、フェッチ時に何が起こるかを心配する必要があります。(日付/時刻型に関しては、データベースはかなり混乱しています、 IMO。これはその別の例です...)一方、Javaでもデータを取得している場合は、透過的に機能することです。少なくとも試してみる価値はありそうです...

于 2013-08-13T14:42:38.533 に答える