8

私は JDBC Date 列を持っています。これは、getDate を使用すると ' date ' 部分のみが取得されますが、getTimestamp を使用すると完全な ' date ' 02 Oct 2009 13:56:78:890が取得されます。これはまさに私が欲しいものです。

ただし、getTimestamp によって返される「日付」は GMT 値を「無視」します。2009 年 10 月 2 日 13:56:78:8902009 年 10 月 2 日 15:56:78:890になります。

私の日付はデータベースに +2GMT の日付として保存されましたが、アプリケーション サーバーは GMT で、つまり 2 時間遅れています

2009 年 10 月 2 日 13:56:78:890の日付をそのまま取得する方法

編集

クライアント側でGMT +2の日付+2を取得します

4

5 に答える 5

13

これが、MySQL の Timestamp とその他の時間型の違いです。タイムスタンプは UTC で Unix time_t として保存されますが、他のタイプは日付/時刻をゾーン情報なしで文字どおりに保存します。

タイプがタイムスタンプの場合、getTimestamp() を呼び出すと、MySQL JDBC ドライバーは時刻を GMT からデフォルトのタイムゾーンに変換します。他の型については、そのような変換は実行されません。

列のタイプを変更するか、自分で変換を行うことができます。以前のアプローチをお勧めします。

于 2009-10-02T12:13:46.867 に答える
4

java.util.Date(および のサブクラスである と もjava.sql.Date)java.sql.Timestampタイムjava.util.Dateゾーンについて何も知らないことに注意してください。つまり、それらは常に UTC です。

java.util.Dateそのサブクラスは、「1970 年 1 月 1 日午前 12 時 (UTC) からのミリ秒数」値のコンテナーにすぎません。

特定のタイムゾーンで日付を表示するには、java.text.DateFormatオブジェクトを使用して日付を文字列に変換します。メソッドを呼び出して、そのオブジェクトのタイムゾーンを設定しますsetTimeZone()。例えば:

Date date = ...;  // wherever you get this from

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// Make the date format show the date in CET (central European time)
df.setTimeZone(TimeZone.getTimeZone("CET"));

String text = df.format(date);
于 2009-10-02T12:05:56.697 に答える
3

先日、時間コンポーネントがいくつかの日付から切り捨てられていたという同様の問題に遭遇しました。

OracleDriverのバージョンの違いに絞り込みました。

OracleのFAQには、これに関するセクションがあります。


select sysdate from dual; ...while(rs.next())

9201より前では、これは次を返します。sysdateのgetObject:java.sql.Timestamp <<<< sysdateのgetDate:java.sql.Date sysdateのgetTimetamp:java.sql.Timestamp

9201以降は以下が返されます

sysdateのgetObject:java.sql.Date <<<<< sysdateのgetDate:java.sql.Date>>変更なしsysdateのgetTimetamp:java.sql.Timestamp>>変更なし

注:java.sql.Dateには時間部分がありませんが、java.sql.Timestampにはあります。

このデータ型マッピングの変更により、JDBCドライバーが8i /9iR1から920xJBDCドライバーにアップグレードされると、一部のアプリケーションが失敗したり、誤った結果が生成されたりします。互換性を維持し、アップグレード後もアプリケーションを機能させ続けるために、互換性フラグが提供されました。開発者にはいくつかのオプションがあります。

  1. oracle.jdbc.V8Compatibleフラグを使用します。

JDBC Driverは、デフォルトではデータベースのバージョンを検出しません。TIMESTAMPデータ型を処理するための互換性フラグを変更するには、接続プロパティ

'oracle.jdbc.V8Compatible'

'true'に設定でき、ドライバーは8i、901x、9 200で動作するように動作します(TIMESTAMPに関して)。

デフォルトでは、フラグは「false」に設定されています。OracleConnectionコンストラクタでは、ドライバはサーバーのバージョンを取得し、互換性フラグを適切に設定します。

java.util.Properties prop=newjava.util.Properties(); 
prop.put("oracle.jdbc.V8Compatible","true"); 
prop.put("user","scott"); 
prop.put("password","tiger");
String url="jdbc:oracle:thin:@host:port:sid"; 
Connection conn = DriverManager.getConnection(url,prop);

JDBC 10.1.0.xでは、接続プロパティの代わりに、次のシステムプロパティを使用できます。java-Doracle.jdbc.V8Compatible = true .....注:このフラグは、タイムスタンプと日付マッピング。データベース機能には影響しません。

'2。それに応じてDateおよびTimeStamp列のデータ型を処理する場合は、set/getDateおよびset/getTimestampを使用します。

9iサーバーは、日付とタイムスタンプの両方の列タイプをサポートします。DATEはjava.sql.Dateにマップされ、TIMESTAMPはjava.sql.Timestampにマップされます。


したがって、私の状況では、次のようなコードがありました。

import java.util.Date; 
Date d = rs.getDate(1);

9iでは、java.sql.Timestamp(java.util.Dateのサブクラス)を取得していたので、すべてがグルーヴィーで、時間と分がありました。

しかし、10gでは、同じコードがjava.sql.Date(java.util.Dateのサブクラスでもあるため、コンパイルされます)を取得しますが、HH:MMは切り捨てられます!!。

2番目の解決策は私にとって非常に簡単でした-getDateをgetTimestampに置き換えるだけで、問題ないはずです。それは悪い習慣だったと思います。

于 2009-10-21T20:51:28.957 に答える
0
private Date convertDate(Date date1) throws ParseException {
        SimpleDateFormat sdfFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = sdfFormatter.format(date1);
        SimpleDateFormat sdfParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdfParser.setTimeZone(TimeZone.getTimeZone("GMT"));
        return sdfParser.parse(dateStr);
    }
于 2013-03-09T13:33:12.163 に答える
0

この投稿から、JDBC はタイムスタンプのタイムゾーンを取得するという結論に達しました (MS SQL もこれをサポートしているとは思いません。ほとんどの Google の結果は Oracle を指しています)。

JDBC getTimeStamp メソッドが呼び出されると、「ミリ秒部分のみが取得され、GMT であるサーバー TimeZone で Date オブジェクトが作成されます。

この Date オブジェクトが +2 GMT であるクライアントに提示されると、余分な時間につながる標準オフセットである 2 時間が追加されます。

取得した日付から時間オフセットを削除することでこれを修正しました。つまり、実際の G​​MT 日付に変換します。

于 2009-10-02T14:59:58.473 に答える