Java: 現在の文字列の日付形式が必要な形式に従っているかどうかを確認します [重複] 質問する

Java: 現在の文字列の日付形式が必要な形式に従っているかどうかを確認します [重複] 質問する

何か方法はあるか知りたかったジャワそれができます。そうでなければ、正規表現ソリューションを選択するかもしれません。

ユーザーからの入力文字列は任意の文字にすることができます。そして、入力文字列が必要な日付形式に従っているかどうかを確認したいと思います。

私が入力したように20130925必要なフォーマットは年/月/日だから、この場合は間違い

この日付を変換したいわけではなく、入力文字列が必要な日付形式に従っているかどうかを確認したいだけです。



私は次のことを試しました

Date date = null;
try {
date = new SimpleDateFormat("dd/MM/yyyy").parse("20130925");
} catch (Exception ex) {
// do something for invalid dateformat
}

しかし、私の catch (Exception ex) ブロックは、SimpleDateFormat.Parse() によって生成された例外をキャッチできません。

ベストアンサー1

免責事項

文字列を未知の形式の日付/時刻値に解析することは本質的に不可能です(正直に言うと、3/3/3実際には何を意味するのでしょうか?!)私たちにできることは「最善の努力」だけです。

重要

この解決策しないをスローするExceptionと が返されますboolean。これは設計によるものです。 は、Exception純粋にガード メカニズムとして使用されます。

2018

2018年になり、Java 8以降には日付/時刻API(そして他のバージョンにはThreeTen バックポート)。解決策は基本的に同じですが、以下のチェックを実行する必要があるため、少し複雑になります。

  • 日時
  • 日付のみ
  • 時間のみ

こんな感じになります...

public static boolean isValidFormat(String format, String value, Locale locale) {
    LocalDateTime ldt = null;
    DateTimeFormatter fomatter = DateTimeFormatter.ofPattern(format, locale);

    try {
        ldt = LocalDateTime.parse(value, fomatter);
        String result = ldt.format(fomatter);
        return result.equals(value);
    } catch (DateTimeParseException e) {
        try {
            LocalDate ld = LocalDate.parse(value, fomatter);
            String result = ld.format(fomatter);
            return result.equals(value);
        } catch (DateTimeParseException exp) {
            try {
                LocalTime lt = LocalTime.parse(value, fomatter);
                String result = lt.format(fomatter);
                return result.equals(value);
            } catch (DateTimeParseException e2) {
                // Debugging purposes
                //e2.printStackTrace();
            }
        }
    }

    return false;
}

これにより、次のようになります...

System.out.println("isValid - dd/MM/yyyy with 20130925 = " + isValidFormat("dd/MM/yyyy", "20130925", Locale.ENGLISH));
System.out.println("isValid - dd/MM/yyyy with 25/09/2013 = " + isValidFormat("dd/MM/yyyy", "25/09/2013", Locale.ENGLISH));
System.out.println("isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = " + isValidFormat("dd/MM/yyyy", "25/09/2013  12:13:50", Locale.ENGLISH));
System.out.println("isValid - yyyy-MM-dd with 2017-18--15 = " + isValidFormat("yyyy-MM-dd", "2017-18--15", Locale.ENGLISH));

出力...

isValid - dd/MM/yyyy with 20130925 = false
isValid - dd/MM/yyyy with 25/09/2013 = true
isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = false
isValid - yyyy-MM-dd with 2017-18--15 = false

元の回答

次のようなものを使用して、String必要なものを解析してみてください。DateSimpleDateFormat

Date date = null;
try {
    SimpleDateFormat sdf = new SimpleDateFormat(format);
    date = sdf.parse(value);
    if (!value.equals(sdf.format(date))) {
        date = null;
    }
} catch (ParseException ex) {
    ex.printStackTrace();
}
if (date == null) {
    // Invalid date format
} else {
    // Valid date format
}

次に、このアクションを実行し、 null でないtrue場合は返す単純なメソッドを記述します...Date

提案としては…

実行例を更新しました

何をしているのか分かりませんが、次の例です...

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

public class TestDateParser {

    public static void main(String[] args) {
        System.out.println("isValid - dd/MM/yyyy with 20130925 = " + isValidFormat("dd/MM/yyyy", "20130925"));
        System.out.println("isValid - dd/MM/yyyy with 25/09/2013 = " + isValidFormat("dd/MM/yyyy", "25/09/2013"));
        System.out.println("isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = " + isValidFormat("dd/MM/yyyy", "25/09/2013  12:13:50"));
    }

    public static boolean isValidFormat(String format, String value) {
        Date date = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            date = sdf.parse(value);
            if (!value.equals(sdf.format(date))) {
                date = null;
            }
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return date != null;
    }

}

出力は次のようになります...

java.text.ParseException: Unparseable date: "20130925"
isValid - dd/MM/yyyy with 20130925 = false
isValid - dd/MM/yyyy with 25/09/2013 = true
isValid - dd/MM/yyyy with 25/09/2013 12:13:50 = false
    at java.text.DateFormat.parse(DateFormat.java:366)
    at javaapplication373.JavaApplication373.isValidFormat(JavaApplication373.java:28)
    at javaapplication373.JavaApplication373.main(JavaApplication373.java:19)

正しくありません。isValidFormat("yyyy-MM-dd", "2017-18--15"); の場合、例外はスローされません。

isValid - yyyy-MM-dd", "2017-18--15 = false

私にとっては期待通りに動作するようです - メソッドは操作を実行するために例外だけに依存しません(例外をスローすることもありません)。

おすすめ記事