3

以下は、私が実行しているコードです。

@Test
public void testMyMehotd() {
    String expected = "2012-09-12T20:13:47.796327Z";
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'");
    //df.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date d = null;
    try {
        d = df.parse(expected);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return;
    }

    String actual = df.format(d);

    System.out.println(expected);
    System.out.println(actual);

}

しかし、出力は私が期待したものとは異なります。

expected : 2012-09-12T20:13:47.796327Z
actual   : 2012-09-12T20:27:03.000327Z

誰かがこれの理由と解決策を教えてもらえますか。

前もって感謝します。

4

2 に答える 2

5

999ミリ秒を超えるたびに、残りのミリ秒を日付に追加DateFormatしようとします。次の簡単な例を考えてみましょう。

 String expected = "2012-09-12T20:13:47.1001Z";
 DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSS'Z'");
 Date d = df.parse(expected);

結果の日付は になります2012-09-12T20:13:48.0001。つまり、1001ミリ秒があるため、1 余分な秒 (1000ミリ秒) と1ミリ秒 ( 1001 % 1000) が得られます。したがって47、元の日付のように秒ではなく、秒を取得します48


これは、月の日数が無効な日付を解析しようとした場合にも発生します。たとえば、9 月に余分な日を追加して解析しようとすると、次のようになります2012-09-31

String expected = "2012-09-31";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date d = df.parse(expected);
System.out.println(df.format(d));

あなたは実際に得るでしょう2012-10-01。繰り返しますが、これDateFormatは、 が 9 月 31 日が無効であることを検出し、ヒューリスティックを使用して を変換しようとするためですDateしたがって、1 日追加して、翌月の 1 日で終了します。

寛大なモードを次のように設定することで、これらのヒューリスティックを使用しないようにパーサーに指示するオプションがありますfalse

df.setLenient(false);

ただし、このモードを使用すると、上記の両方の例でParseException.

于 2012-09-12T21:23:12.677 に答える
2

Sミリ秒を意味し、796327 ミリ秒を渡しました。その数は 13[分]:16[秒]:327[ミリ] に等しいため、日付に分と秒が追加されます。

于 2012-09-12T21:23:02.287 に答える