我正在寻找以 MM/YY 格式验证信用卡到期日期。我不知道如何验证,是否选择简单日期格式/正则表达式。
感谢你的帮助。
用于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
如果输入不正确,上面的代码现在将抛出一个。
扮演魔鬼的拥护者...
boolean validateCardExpiryDate(String expiryDate) {
return expiryDate.matches("(?:0[1-9]|1[0-2])/[0-9]{2}");
}
翻译为:
...所以这个版本需要零填充月份(01 - 12)。?
在第一个之后添加一个0
以防止这种情况。
要验证您是否有有效的到期日期字符串:
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 的日期时间。
你真的需要使用正则表达式吗?正则表达式实际上只适合匹配字符,而不是日期。我认为只使用简单的日期函数会容易得多。
我认为代码会更好:
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());
您需要计算下个月,因为信用卡上显示的月份是卡有效的最后一个月。