1

私はこのインターフェースメソッドについて話している:

http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getTimestamp%28int,%20java.util.Calendar%29

最も一般的に使用される実装は、cachedrowset のものです。

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/com/sun/rowset/CachedRowSetImpl.java行 6170

実装が 2 つの非常に奇妙なことを行うことに気付くでしょう。

1)戻り値もありますが、引数として渡されたカレンダーを変更します

2)引数として渡されたカレンダーからのミリ秒を除いて、 SQL からすべての時間情報を抽出します。

インターフェイスの説明はかなり不明確ですが、実装が正しいと仮定すると、このメソッドのポイントは何ですか? カレンダーを変更せずにタイムゾーンのみを抽出する方法を理解できます。しかし、カレンダーを取得して変更し、ゾーンだけでなくミリ秒も抽出します...

この API の背後にある歴史/設計/理由について洞察を持っている人はいますか?

4

2 に答える 2

2

これは、JDBC API ドキュメントの誤った解釈のようです (残念ながら、javax.sql.rowsetこれらの誤った解釈がもっとあります)。

デフォルトでは、JDBC ドライバーは、データベースに格納されている時刻が JVM の現在のタイムゾーンにあるかのように、時刻またはタイムスタンプを格納または取得する必要があります。これは常にあなたが望むものではないので、API は、Calendar使用する実際のタイムゾーンを導出するために使用する必要があるオブジェクトを提供するメソッドを提供します (代わりに使用しなかった理由はわかりませんjava.util.TimeZone)。

これはPreparedStatement.setTimeStampで指定されます。

オブジェクトを使用すると、ドライバーはカスタム timezone を考慮しCalendarてタイムスタンプを計算できます。オブジェクトが指定されていない場合、ドライバーは、アプリケーションを実行している仮想マシンのデフォルトのタイムゾーンを使用します。Calendar

のメソッドgetTimestampは、ResultSetこれらの同じ規則に従います (または従う必要があります)。

したがって、データベースに時刻「11:20」が保存されていて、ローカル タイムゾーンが CET (UTC+1) の場合、取得される時刻は 10:20 UTC (11:20 CET) です。ただしCalendar、GMT で を指定すると、返される時刻は 11:20 UTC (12:20 CET) になります。

于 2015-01-07T11:00:28.903 に答える
1

SQL データベースは、タイムスタンプの日付と時刻の値を、年、月、日、時、分、秒などの形式で保存します。これらの値が指定する時間のインスタンスは、解釈されるタイムゾーンによって異なります(例: 2014. 1 月 1 日 15 :00:00 は、ヨーロッパではアメリカよりも同じ時間ではありません)。タイムゾーン、列のタイプに応じて、タイムスタンプの一部になる場合と含まれない場合があります。

Javajava.sql.Timestampjava.util.Dateクラスは、タイム ゾーンに関係なく (つまり、固定の UTC タイム ゾーンで) 時間のインスタンスを表します。

SQL データベースの列に日付と時刻とともにタイムゾーン情報が格納されていない場合、そのようなタイムスタンプからJavaDateまたはオブジェクトを作成するにはタイムゾーンが必要です。TimeStampタイムゾーン)。

問題のメソッドを使用して SQL タイムスタンプ データを取得し、パラメーターオブジェクトに設定されたタイムゾーン情報を使用してResultSet.getTimestamp()それを Java インスタンスに変換できます。TimestampCalendar

于 2015-01-07T10:40:59.340 に答える