4

我正在寻找以 MM/YY 格式验证信用卡到期日期。我不知道如何验证,是否选择简单日期格式/正则表达式。

感谢你的帮助。

4

5 回答 5

20

用于SimpleDateFormat解析 a Date,然后将其与 new 进行比较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}");
}

翻译为:

...所以这个版本需要零填充月份(01 - 12)。?在第一个之后添加一个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 的日期时间。

于 2019-03-14T12:57:04.777 回答
0

你真的需要使用正则表达式吗?正则表达式实际上只适合匹配字符,而不是日期。我认为只使用简单的日期函数会容易得多。

于 2012-07-17T19:02:04.557 回答
0

我认为代码会更好:

int month = 11;
int year = 2012;

int totalMonth = (year * 12) + month;
totalMonth++; // next month needed
int nextMonth = totalMonth % 12;
int yearOfNextMonth = totalMonth / 12;

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/yyyy");
simpleDateFormat.setLenient(false);
Date expiry = simpleDateFormat.parse(nextMonth + "/" + yearOfNextMonth);
boolean expired = expiry.before(new Date());

您需要计算下个月,因为信用卡上显示的月份是卡有效的最后一个月。

于 2019-03-14T12:32:11.257 回答