2

コードでフラット ファイルを解析した後、DateTimeフラット ファイルに存在する文字列値をオブジェクトとして変換しようとしています。Date

私はそれを行うためのコードを書きましたが、日付をフォーマットすると、指定された値に対して常に 1 日以上の日付が表示され、5:30 が追加されることもあります。

以下はそのためのコードです。

    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----" + date);

上記の出力は

    ---date----Wed Aug 24 08:30:03 IST 2011  

ここで何が問題なのか教えてください。クラスで使用しているパターンに問題がSimplaDateFormatありますか、それともコードに問題がありますか。私はこれについて長い間頭を悩ませてきました。

4

3 に答える 3

6

ここで何が問題なのか教えてください。

もちろん。元のテキスト値を解析するために使用されたについて何もdate.toString()知らない を効果的に呼び出しています。Aはほんの一瞬です。インスタンスごとの形式の概念はありません。さらに、タイム ゾーンについても認識しません。PDT で値を指定し、それを解析しました...そしてそれを印刷すると、システムのローカル タイム ゾーン (IST) が使用されます。それはいつもすることです。SimpleDateFormatDateDate.toString

Date特定の時間帯で特定の形式を使用して、特定の方法で をフォーマットする場合は、 を呼び出しますDateFormat.format

于 2012-09-25T15:48:10.510 に答える
3

システムのタイムゾーンが異なります。出力には IST (インド標準時) が表示されています。これは、PDT との差が 12.5 時間です。コードは、PDT (UTC -7) である特定の日付を適切に解析し、IST (UTC +5h30) を出力しています。

Java は日付を UTC 日付として格納します。そのため、PDT 日付を解析すると、Java はそれを UTC に変換し、UTC タイムスタンプとして内部に保存します。印刷するときにタイムゾーンを指定しないと、デフォルトでシステムのタイムゾーンになります。この場合、IST のように見えます。

正確なタイムゾーンを指定するには、SimpleDateFormat で指定します。

DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy");
f.setTimeZone(TimeZone.getTimeZone("PDT"));
Date date = f.parse("Tue Aug 23 20:00:03 PDT 2011");
System.out.println("---date----" + f.format(date));
于 2012-09-25T15:48:51.117 に答える
1

をフォーマットしていないためですdate。例を見てください

  public static void main(String[] args){
    Locale currentLocale = Locale.US;
    DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy", currentLocale);
    Date date = null;
    Date today;
    try {
      today = new Date();
      String result = f.format(today);
      System.out.println("Locale: " + currentLocale.toString());
      System.out.println("Result: " + result);
      date = f.parse("Tue Aug 23 20:00:03 PDT 2011");
    } catch (ParseException e) {
      e.printStackTrace();  
    }
    System.out.println("---date----" + f.format(date));
  }

出力します

Locale: en_US
Result: Tue Sep 25 19:12:38 EEST 2012
---date----Tue Aug 23 20:00:03 PDT 2011

これで、コードが少し変更されました

  public static void main(String[] args){
    Locale currentLocale = Locale.US;
    DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy", currentLocale);
    DateFormat f2 = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy", currentLocale);
    Date date = null;
    Date today;
    try {
      today = new Date();
      String result = f.format(today);
      System.out.println("Locale: " + currentLocale.toString());
      System.out.println("Result: " + result);
      date = f.parse("Tue Aug 23 20:00:03 PDT 2011");
      System.out.println("---date----" + f.format(date));
      System.out.println("---date----" + f2.format(date));

    } catch (ParseException e) {
      e.printStackTrace();
    }
  }

に出力する

Locale: en_US
Result: Tue Sep 25 20:42:10 EEST 2012
---date----Tue Aug 23 20:00:03 PDT 2011
---date----Wed Aug 24 06:00:03 EEST 2011  

パターンが指定されSimpleDateFormatていても、タイムゾーンは気にしないようです。'z'入力を解析するときにタイムゾーンを設定しています。それが私がそれを奇妙な行動だと説明できる方法です。その場合、'z'パターンの使用は時代遅れに見え、予測できない結果につながります。

を設定するTimeZoneと問題が解決します

f2.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
于 2012-09-25T16:16:37.670 に答える