0

Oracle データベースの開始日と終了日から 2 つのタイムスタンプを取得しています。彼らはこの形式で来ますyyyy-MM-dd HH:mm:ss.SSS

今、テキスト ファイルから比較のために別のタイムスタンプを取得しています。文字列形式です。以下は、必要な情報を抽出するために作成したコードです。

    DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy");
    Date date = f.parse("Tue Aug 23 20:00:03 PDT 2011");
    System.out.println("---date----" + f.format(date));
    String originalDate = f.format(date);
    System.out.println("---originalDate----" + originalDate);

    DateFormat f2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    String dateParse = f2.format(date);
    System.out.println("---dateParse----"+dateParse);

私が得ている出力は少し奇妙で、非常に一貫性がありません。以下はサンプルです ---date----Tue Aug 23 20:00:03 PDT 2011 ---originalDate----Tue Aug 23 20:00:03 PDT 2011 ---dateParse----2011-08 -24 08:30:03.000

上記の出力では、比較のために必要な ----dateparse--- 値に関心があります。理想的なケースで値が変化していることがわかれば、両方とも同じ値になるはずです。

ここでの問題は、出力がタイムゾーンによって異なる場合、データベースからフェッチされたデータからコードを比較するにはどうすればよいですか?

--dateparse-- が db から取得した日付範囲の間にあるかどうかを確認するだけです。このコードはタイムゾーンに関係なく適切に機能しますか、それともここに問題があります。日付が異なる場合、比較がうまくいかないか、上記の2つの出力で正しい方法ですか。

この問題を解決する方法を教えてください。

4

3 に答える 3

1

クラスのドキュメントを参照して、コンストラクターを使用してください。

http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

SimpleDateFormat(String pattern, Locale locale)

ロケールを確認するには、次のコードを使用します。

Locale.getDefault()

おそらくそれが、これらの結果を得ている理由です。

于 2012-09-25T20:05:56.803 に答える
0

--dateparse-- が db から取得した日付範囲の間にあるかどうかを確認する必要があります。

推定:

  1. Dateオブジェクトはデータベースから取得されます
  2. 解析対象のファイル形式にタイムゾーン情報が埋め込まれている

次に、 のすべてのインスタンスはDate適切な絶対値 (1970 年 1 月 1 日からのミリ秒をカウント) を持ち、正しく比較されます。

では、何に気をつければよいのでしょうか。タイムゾーンまたはロケール情報を含まない日付/時刻文字列。これらのいずれかを解析する場合、ロケールとタイムゾーンが使用されますが、これはデータが書き込まれた時間/場所とは異なる場合があります。この場合、取得されDateた は間違った絶対時間を参照する可能性があります。

于 2012-09-25T20:23:07.160 に答える
0

2 番目の日付形式にタイム ゾーンを追加すると、barbosaが指摘したように、デフォルトのロケールを使用して出力されることがわかります。たとえば、私の PC では、英国の現在のタイム ゾーンである英国夏時間で表示されます。

DateFormat f2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS zz");
System.out.println("---dateParse----" + f2.format(date));

出力:

---dateParse----2011-08-24 04:00:03.000 BST

setTimeZone日付形式の出力タイム ゾーンを強制する場合は、次のメソッドを使用してこれを行うことができます。

f2.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));

出力は次のようになります。

---dateParse----2011-08-23 20:00:03.000 PDT

と同様Localeに、必要に応じTimeZonegetDefaultメソッドがあります。

于 2012-09-25T20:26:14.887 に答える