1

文字列が ISO-8601 の日付であるかどうかを検証しようとしていますが、解析例外がスローされており、どこが間違っているのかわかりません。

try {
    String s = "2007-03-01T13:00:00Z";
    SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    ft.setLenient(false);
    System.out.println(ft.format(ft.parse(s)));
} catch (ParseException e) {
    System.out.println(e.getMessage());
}

出力は次のとおりです。

Unparseable date: "2007-03-01T10:00:00Z"
4

5 に答える 5

4

Zそれはタイムゾーンとして解釈されていると思われるので、一致しますが-0800リテラルではないZので、引用することで解決できます: 'Z'.

getErrorOffsetどこに問題があるかを教えてくれるはずです。

于 2012-10-29T14:58:03.757 に答える
2

Java 7 を使用している場合は、次の書式文字列を使用します。"yyyy-MM-dd'T'HH:mm:ssXXX"

注:Xは、ISO 8601 タイム ゾーン文字列に一致する新しいコード (Java 7 で追加) です。の API ドキュメントを参照してくださいSimpleDateFormat

于 2012-10-29T15:21:54.817 に答える
1

SDF は非常に制限されているため、作成時に ISO 8601 を認識していなかったため、コードは機能しません。

次のコードを使用できます。

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.lang.time.DateUtils;

public final class JSONDateUtil {

    private static final DateFormat ISO8601_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

    static  {
        ISO8601_FORMAT.setLenient(false);
        ISO8601_FORMAT.setTimeZone(DateUtils.UTC_TIME_ZONE);
    }

    public static String toJSON(Date date) {
        return ISO8601_FORMAT.format(date);
    }

    public static String toJSON(long millis) {
        return ISO8601_FORMAT.format(millis);
    }

    public static Date toJava(String date) {
        try {
            return ISO8601_FORMAT.parse(date);
        } catch (ParseException e) {
            return null;
        }
    }

}

タイムゾーンに注意してください。非常に重要です。

于 2012-10-29T15:00:16.563 に答える
1

任意の文字列を検証する場合、「2007-03-01T13:00:00+01」などの有効な ISO8601 タイム スタンプでは検証が失敗するため、「Z」タイム ゾーン指定子をハードコードすることはできません。

Java 6 以前を使用している場合、SimpleDateFormat は ISO8601 タイム ゾーン エンコーディングをサポートしないため、タイム スタンプの検証にも使用できません。Java 7 以降では、 を使用できますnew SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");

于 2012-10-29T15:19:18.357 に答える
0

Joda-Time

参考までに、厄介なことで悪名高い java.util.Date/Calendar クラスの代わりにJoda-Timeを使用した場合は、フォーマッターを使わずに、そのISO 8601文字列を直接DateTimeコンストラクターに渡すことができます。Joda-Time は ISO 8601 をデフォルトとして使用します。

DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime = new DateTime( "2007-03-01T13:00:00Z", timeZone );

検証

入力文字列が無効かどうかを判断するには、 catch IllegalArgumentException.

java.util.Date

必要に応じて、java.util.Date を取得することもできます。

java.util.Date date = dateTime.toDate();
于 2014-02-19T08:07:40.203 に答える