我希望以MM / YY格式验证信用卡到期日期。我不知道如何验证,是否采用简单日期格式/正则表达式。
感谢您的帮助。
答案 0 :(得分:13)
使用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
。
答案 1 :(得分:6)
扮演魔鬼的拥护者......
boolean validateCardExpiryDate(String expiryDate) {
return expiryDate.matches("(?:0[1-9]|1[0-2])/[0-9]{2}");
}
翻译为:
...所以这个版本需要零填充月份(01 - 12)。在第一个?
之后添加0
以防止此情况发生。
答案 2 :(得分:0)
你真的需要使用正则表达式吗?正则表达式实际上只适用于匹配字符,而不是日期。我认为使用简单的日期函数会容易得多。
答案 3 :(得分: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());
您需要计算下个月,因为信用卡上显示的月份是信用卡有效的最后一个月份。
答案 4 :(得分: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 tutorial: Date Time解释了如何使用java.time。