Java 比较MMYY格式的日期

Java 比较MMYY格式的日期,java,date-formatting,Java,Date Formatting,因此,我正在制作一个Java程序来处理用户的假信用卡,并试图制作一个过期验证条件语句。然而,当我运行我的程序时,我得到一个“字符串不能转换为int”错误。我想知道我应该如何使用当前月份和年份来检查用户输入的日期是否实际过期 do { System.out.print("Enter the expiration date mmyy: "); expiration = expnum.nextInt(); DateFormat dateformat = new SimpleDateFor

因此,我正在制作一个Java程序来处理用户的假信用卡,并试图制作一个过期验证条件语句。然而,当我运行我的程序时,我得到一个“字符串不能转换为int”错误。我想知道我应该如何使用当前月份和年份来检查用户输入的日期是否实际过期

do {
  System.out.print("Enter the expiration date mmyy: ");
  expiration = expnum.nextInt();

  DateFormat dateformat = new SimpleDateFormat("MMyy");
  Date date = new Date();
  System.out.println(dateformat.format(date));
  int currentdate = dateformat.format(date);

  if (currentdate <= expiration) {
    check = check + 1;
  } else {
    check = 1;
  }
} while (check == 1);
do{
系统输出打印(“输入到期日期mmyy:”);
expiration=expnum.nextInt();
DateFormat DateFormat=新的SimpleDateFormat(“MMyy”);
日期=新日期();
System.out.println(dateformat.format(date));
int currentdate=dateformat.format(日期);

如果(currentdate它不是一个int。它是一个字符串。这是错误的:

int currentdate = dateformat.format(date);
如果您确实需要整数,请将其转换为整数:

int currentdate = Integer.parseInt(dateformat.format(date));
但是,它不会是一个非常合理的整数。如果您希望将其作为一个更合理的整数进行比较,那么您必须先将年份放在首位,然后再将月份放在首位(格式:yyMM或yyyyMM)。这样,它将是一个连续的数字比较,可以与其他信用卡日期进行比较。或者,您可以简单地将其转换为
日期
日历
,然后使用日期比较


此外,您应该将变量“
check”
”设置为布尔值。您不需要将其设置为数值。

您可以将expnum.nextLine()替换为Integer.parseInt(expnum.nextLine());这将获取输入字符串,并将其转换为int。如果他们不输入int,它将通过一个异常,因此您可以将其放入try-catch语句中(并将其放入while循环或类似的内容中,这样它会一直询问,直到他们以正确的格式回答为止,如果您愿意的话).

虽然@ManoDestra的解决方案会起作用,但我更愿意让类型/数据保持合理。因此,与其将现有的日期转换为
int
(这有点荒谬,而且
格式
后跟
解析
感觉很糟糕),我更愿意将过期时间解析为一个日期,然后直接进行比较。如下所示:

expiration = expnum.nextInt();
DateFormat dateformat = new SimpleDateFormat("MMyy");
Date expiryDate = dateFormat.parse(expiration);

Date currentDate = new Date();

if (currentDate.isAfter(expiryDate)) {
   // card has expired
} else {
   // card is still active
}
您可能需要根据您认为有效期实际发生的时间对此进行调整。如果有效期指定为“0816”,是指
01-Aug-2016 00:00:00.000
,还是
31-Aug-2016 23:59:59.999
,还是介于两者之间的某个点

这是你必须做的一个调用(可能是通过查看信用卡规范),但与int转换方法相比,这是另一件事:它不仅仅是“使用适当类型”的抽象意义,但它也可以转化为现实世界。通过将过期字符串转换为日期,您需要准确地考虑它所代表的时间瞬间,以及“现在”的哪些值应算作过期值,哪些值不应算作过期值。

YearMonth
类 这个班级代表一年零一个月

java.time 该类是内置于Java 8及更高版本中的框架的一部分。这些类取代了旧的麻烦的日期时间类,如Java.util.date。请参阅。许多功能已在中向后移植到Java 6和7,并在中进一步适用于Android

解析字符串 使用a解析输入字符串。如果省略世纪,则假定为21世纪
20

String input = "0616";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MMyy" );
YearMonth expiration = YearMonth.parse ( input , formatter );
转储到控制台

System.out.println ( "yearMonth = " + yearMonth );
年月=2016-06

时区 与当前的
YearMonth
相比。确定当前的年-月意味着获取当前的日期。而确定当前的日期需要一个时区。问题和其他答案忽略了这一关键问题。在任何给定的时刻,全球各地的日期都会因时区而异。巴黎之后几分钟是新的一天,但仍然是蒙特勒尔的“昨天”

如果作为可选参数省略,JVM的当前默认时区将以隐式方式应用。当前默认值,即使在运行时(!)。最好指定预期/期望的时区

ZoneId zoneId = ZoneId.of( "America/Montreal" );
YearMonth currentYearMonth = YearMonth.now( zoneId );
如果您的业务规则恰好用作时区,请将handy常量作为时区参数传递

比较 最后,我们使用
isBefore
或进行比较


与其传递年和月的字符串或整数,不如传递这些
YearMonth
对象。您可以获得类型安全性、有保证的有效值和更多自文档化代码的好处。

将其作为
yyMM
格式的字符串进行比较,其自然顺序是正确的:

int expiration; // MMyy
String expirationStr = String.format("%02d%02d", expiration % 100, expiration / 100);
String now = new SimpleDateFormat("yyMM").format(new Date());
if (expirationStr.compareTo(now) < 0)
    // expired
int到期;//MMyy
String expirationStr=String.format(“%02d%02d”,过期%100,过期/100);
String now=new SimpleDateFormat(“yyMM”).format(new Date());
if(expirationStr.compareTo(now)<0)
//过期

“处理假用户信用卡”…粗略:)
dateformat.format(date)
返回一个
字符串
,您只需使用
Integer.parseInt(…)将其转换为
int
。这并不理想;您希望比较日期,而不是依赖整数。这部分解决了我的问题,但我想知道如何编辑过期检查,以便某些值不起作用。例如,有12个月,但如果我输入13作为MM,程序仍将返回true。这不理想,但这是s解决给定问题和所选设计的方法。他仍然可以使用整数来比较年/月组合,但需要先使用年,而不是最后一个来设置格式,以启用信用卡格式的年/月整数比较。我更新了我的答案,以反映他当前方法的问题:)
int expiration; // MMyy
String expirationStr = String.format("%02d%02d", expiration % 100, expiration / 100);
String now = new SimpleDateFormat("yyMM").format(new Date());
if (expirationStr.compareTo(now) < 0)
    // expired