5

jdbcドライバーによってローカルタイムゾーンに変換されずに、タイムスタンプをデータベースに保存したいと思います。現在、MySQLとPostgreSQLだけが私にとって重要ですが、データベースに依存しないソリューションがあれば幸いです。

例:

// i want that to be saved as 1970-01-01 00:00:00
TimeStamp ts = new java.sql.Timestamp(0);

// gets transformed to local time by jdbc driver (in my case to 1970-01-01 01:00:00)
st.setTimestamp(0, new java.sql.Timestamp(0));

// only works using postgres (mysql connector seems to ignore the calendar)
// postgres => 1970-01-01 00:00:00
// mysql => 1970-01-01 01:00:0
Calendar calutc = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
st.setTimestamp(0, new java.sql.Timestamp(0), utccal);

正しい値に変換されるタイムスタンプ値を計算しようとしましたが(たとえば、私のタイムゾーンでは-3600000 => 1970-01-01 00:00:00)、これはその日の近くの日付のpostgresでは機能しません夏時間が変わります。

4

2 に答える 2

13

解決策を見つけました。MySQL の JDBC コネクタにはバグがあり、提供された Calendar オブジェクトを setTimestamp/getTimestamp に無視していました。彼らはコネクタのバージョン 5.1.5 でバグを修正しましたが、古い (正しくない) 動作は依然としてデフォルトの動作です。正しいコードを使用するには、パラメータ「useLegacyDatetimeCode=false」をコネクタ URL に渡す必要があります。

詳細情報: http://bugs.mysql.com/bug.php?id=15604

于 2013-03-05T15:22:05.507 に答える
1

Java の日付とタイムスタンプはタイムゾーンに依存しません。新しい Timestamp(0) は、実際には UTC の 1970-01-01 00:00:00 に対応しています。SimpleDateFormat を使用し、目的のタイムゾーンを設定して、日付を視覚的に検査する必要があります。System.out.println を使用して印刷したときに「正しく」見えるようにするために、タイムスタンプから長い定数を減算することは非常に間違っています。

データベースを使用する場合、日付/時刻/タイムスタンプのデータ型を選択できます。タイムゾーン情報をサポートするものもあれば、サポートしないものもあります。データベースでタイム ゾーン処理を使用する場合は、詳細に学習する必要があります。それをバイパスしたい場合は、日付/時刻/タイムスタンプを文字列としてデータベースに保存し、Java コードですべてのフォーマットを行うオプションがあります。

于 2013-03-04T20:37:34.840 に答える