7

私はParseException次のコードを取得しています

    String dateStr = "2011-12-22 10:56:24.389362";
    String formatStr = "yyyy-MM-dd HH:mm:ss.SSSSSS";
    Date testDate = null;
    SimpleDateFormat sdf= new SimpleDateFormat(formatStr);
    sdf.setLenient(false);
    testDate = sdf.parse(dateStr);

    System.out.println("CHECK DATE " + sdf.format(testDate));

Exception in thread "main" java.text.ParseException: Unparseable date: "2011-12-22 10:56:24.389362" at java.text.DateFormat.parse(DateFormat.java:337)

行をコメントアウトすると、出力にsdf.setLenient(false)時差が表示されます CHECK DATE 2011-12-22 11:02:53.000362

私は何が間違っているのですか?

4

5 に答える 5

8

「S」はミリ秒を表します。1秒間に1000(0〜999)ミリ秒があります。389362は999より大きいです。余分な389000ミリ秒は、389秒、つまり6分29秒に変換され、時間に追加されます。

于 2011-12-22T17:48:44.940 に答える
5

Sフォーマット指定子はミリ秒を参照します。寛大な解析を許可すると、最後の部分は389362ミリ秒として解釈されます。これまでの日付にそれを追加すると、最後の3桁(実際には値%1000)が実際のミリ秒になり、予想よりも約389秒(約6分半)遅れた日付になります。 。(厳密な解析では、パーサーは389362ミリ秒が意味をなさないことを認識しているため、エラーがスローされます。)

それを回避する最も簡単な方法は、日付が常にそのように見えることを保証できる場合、最後の3桁を切り落とすことです。(これにより、約半分の時間で1ミリ秒ずれた日付が得られます。ただし、日付パーサーを作成するよりも優れています...)

于 2011-12-22T17:52:37.527 に答える
3

ミリ秒の日付入力が正しくありません。そのはず:-

String dateStr = "2011-12-22 10:56:24.389";

また、パターンに余分な数の「S」は必要ありません。以下で十分です。

String formatStr = "yyyy-MM-dd HH:mm:ss.S";

これは、次のプレゼンテーションタイプのJavaドキュメントで明確に言及されていNumberます。

数値:フォーマットの場合、パターン文字の数は最小桁数であり、短い数値はこの量までゼロで埋められます。解析の場合、隣接する2つのフィールドを区切る必要がない限り、パターン文字の数は無視されます。

パーサーに解析を厳密に行わないように要求しているため、lenientをtrueに設定した場合(またはデフォルトのtrueの行をコメントアウトした場合)に機能します。setLenient()のJavaドキュメントから:-

日付/時刻の解析を寛大にするかどうかを指定します。寛大な構文解析では、パーサーはヒューリスティックを使用して、このオブジェクトの形式と正確に一致しない入力を解釈する場合があります。厳密な解析では、入力はこのオブジェクトの形式と一致する必要があります。

于 2011-12-22T17:49:11.370 に答える
2

Sミリ秒の間のみ使用されます。マイクロ秒が必要な場合は、独自のパーサーを作成する必要があります。

于 2011-12-22T17:53:38.257 に答える
0

toISOString('HH:mm:ss.S')ミリ秒(3桁)を取得するために使用し、必要に応じて0で完了します。

例えば:

new Date().toISOString('HH:mm:ss.S')

「2012-02-10T12:16:39.124Z」を返します

于 2012-02-10T12:18:56.830 に答える