3

私は以下のコードを持っていますが、2011 年 2 月 2 日のようなものを入力した場合を除いて、かなりうまく機能します。「ドキュメントの日付は有効な日付ではありません」というエラー メッセージが表示されます。「ドキュメントの日付はMM / DD / YYYYの形式にする必要があります」と表示されると思います。

なぜ行newDate = dateFormat.parse(date);はそれをキャッチしないのですか?

// checks to see if the document date entered is valid
    private String isValidDate(String date) {

        // set the date format as mm/dd/yyyy
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
        Date newDate = null;

        // make sure the date is in the correct format..        
        if(!date.equals("mm/dd/yyyy")) {
            try {
                newDate = dateFormat.parse(date);
            } catch(ParseException e) {
                return "The Document Date needs to be in the format MM/DD/YYYY\n";
            }

            // make sure the date is a valid date..
            if(!dateFormat.format(newDate).toUpperCase().equals(date.toUpperCase())) {
                return "The Document Date is not a valid date\n";
            }

            return "true";
        } else {
            return "- Document Date\n";
        }
    }

編集: MM/DD/YYYY の形式を厳守しようとしています。ユーザーが「2011 年 2 月 2 日」と入力すると、「ドキュメントの日付は MM/DD/YYYY の形式である必要があります」というメッセージが表示されるように、コードを変更するにはどうすればよいですか?

4

2 に答える 2

4

すでに述べたように、SimpleDateFormatは「2/2/2011」を「02/02/2011」であるかのように解析できます。noParseExceptionがスローされます。

一方、dateFormat.format(newDate)「02/02/2011」を返し、「2/2/2011」と比較されます。2 つの文字列が等しくないため、2 番目のエラー メッセージが返されます。

setLenient(false)この場合は機能しません:

月: パターン文字の数が 3 つ以上の場合、月はテキストとして解釈されます。それ以外の場合は、数値として解釈されます。

数字: 書式設定の場合、パターン文字の数は最小桁数であり、それより短い数字はこの量までゼロで埋められます。解析では、隣接する 2 つのフィールドを分離する必要がない限り、パターン文字の数は無視されます。

(ソース: Java ドキュメント)

正規表現を使用して、文字列形式を手動で確認できます。

if(date.matches("[0-9]{2}/[0-9]{2}/[0-9]{4}")) {
    // parse the date
} else {
    // error: wrong format
}
于 2011-06-01T21:04:20.230 に答える
0

日付は正しいですが、2002年2月2日としてフォーマットされます

于 2011-06-01T20:37:46.550 に答える