4

クレジット カードの有効期限を MM/YY 形式で検証したいと考えています。シンプルな日付形式/正規表現を使用するかどうか、検証方法についての手がかりがありません。

あなたの助けに感謝。

4

5 に答える 5

20

SimpleDateFormatを解析するために使用し、それを「今」でDateある新しいと比較します。Date

String input = "11/12"; // for example
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/yy");
simpleDateFormat.setLenient(false);
Date expiry = simpleDateFormat.parse(input);
boolean expired = expiry.before(new Date());

編集:

@ryanp寛大さの側面に感謝します。上記のコードはParseException、入力が適切でない場合にをスローします。

于 2012-07-17T19:01:36.707 に答える
10

悪魔の代弁者を演じる...

boolean validateCardExpiryDate(String expiryDate) {
    return expiryDate.matches("(?:0[1-9]|1[0-2])/[0-9]{2}");
}

これは次のように変換されます。

  • 0の後に 1 ~ 9、または1 の後に0 ~ 2
  • に続く "/"
  • 続いて 0 ~ 9、2

...そのため、このバージョンではゼロで埋められた月 (01 - 12) が必要です。これを防ぐ?には、最初の後に a を追加します。0

于 2012-07-17T21:41:06.550 に答える
2

java.time

有効な有効期限文字列を取得しているかどうかを検証するには:

    DateTimeFormatter ccMonthFormatter = DateTimeFormatter.ofPattern("MM/uu");
    String creditCardExpiryDateString = "11/21";
    try {
        YearMonth lastValidMonth = YearMonth.parse(creditCardExpiryDateString, ccMonthFormatter);
    } catch (DateTimeParseException dtpe) {
        System.out.println("Not a valid expiry date: " + creditCardExpiryDateString);
    }

クレジット カードの有効期限が切れているかどうかを検証するには:

        if (YearMonth.now(ZoneId.systemDefault()).isAfter(lastValidMonth)) {
            System.out.println("Credit card has expired");
        }

すべてのタイム ゾーンで新しい月が同時に始まるわけではないため、どのタイム ゾーンを使用するかを検討してください。UTC が必要な場合:

        if (YearMonth.now(ZoneOffset.UTC).isAfter(lastValidMonth)) {

必要に応じて、例のために、ヨーロッパ/キエフのタイムゾーン:

        if (YearMonth.now(ZoneId.of("Europe/Kiev")).isAfter(lastValidMonth)) {

リンク: Oracle チュートリアル: Java.time の使用方法を説明する Date Time。

于 2019-03-14T12:57:04.777 に答える
0

本当に正規表現を使用する必要がありますか?正規表現は、日付ではなく、文字の一致にのみ適しています。単純な日付関数を使用する方がはるかに簡単だと思います。

于 2012-07-17T19:02:04.557 に答える