以MMYY格式比较日期

时间:2016-06-30 23:10:33

标签: java date-formatting

所以我正在制作一个处理用户虚假信用卡的Java程序,我正在尝试制作一个到期验证条件声明。但是,当我运行我的程序时,我得到一个“String无法转换为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);

5 个答案:

答案 0 :(得分:3)

虽然@ ManoDestra的解决方案可行,但我更希望保持类型/数据合理。因此,不是将现有日期转换为int(这是一种荒谬的,format后跟parse感觉很讨厌),我宁愿将过期时间解析为日期然后直接比较。像这样:

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
}

您可能需要根据您认为到期时实际发生的情况进行调整。如果到期时间被指定为&#34; 0816&#34;是01-Aug-2016 00:00:00.000,还是31-Aug-2016 23:59:59.999,还是介于两者之间的某个点?

这是你必须做的一个电话(可能是通过查看信用卡规范),但这种方法与转换它的方法相比是另一回事:它不仅仅是使用适当类型&#34;的抽象感,但它也转化为现实世界。通过将到期字符串转换为Date,您需要考虑完全代表什么时间点,以及&#34; now&#34;应该算作过期而哪些不应该。

答案 1 :(得分:2)

YearMonth class

YearMonth课程代表一年零一个月。

java.time

此类是Java 8及更高版本中内置的java.time框架的一部分。这些类取代了旧的麻烦的日期时间类,如java.util.Date。见Oracle Tutorial。许多功能已经被后端移植到Java 6&amp; ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

解析字符串

使用DateTimeFormatter来解析输入字符串。当这个世纪被省略时,假定了21世纪20

String input = "0616";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MMyy" );
YearMonth expiration = YearMonth.parse ( input , formatter );

转储到控制台。

System.out.println ( "yearMonth = " + yearMonth );
  

yearMonth = 2016-06

时区

与当前YearMonth比较。确定当前年度月意味着获取当前日期。确定当前日期需要一个时区。问题和其他答案忽略了这个关键问题。对于任何特定时刻,日期在全球范围内按时区变化。巴黎是新的一天,而在蒙特利尔仍然是“昨天”。

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

ZoneId zoneId = ZoneId.of( "America/Montreal" );
YearMonth currentYearMonth = YearMonth.now( zoneId );

如果您的业务规则恰好使用UTC作为时区,请将方便常量ZoneOffset.UTC作为时区参数传递。

比较

最后,我们使用isBeforeisAfterequals进行比较。

Boolean expired = currentYearMonth.isAfter( expiration );

不是传递年份和月份的字符串或整数,而是传递这些YearMonth个对象。您可以获得类型安全,有保证的有效值以及更多自我记录代码的好处。

答案 2 :(得分:0)

将其作为Uncaught ReferenceError: greeting2 is not defined (15:58:36:083 | error, javascript) 形式的字符串进行比较,其自然顺序正确无误:

yyMM

答案 3 :(得分:-1)

这不是一个int。这是一个字符串。这是错的:

settings.xml

如果你真的想要一个int,那么把它转换成一个int:

int currentdate = dateformat.format(date);

然而,它不会是一个非常明智的int。如果你想让这个比较合理,那么你必须把年份放在第一个月,然后是月份(格式:yyMM或yyyyMM)。这样,它将是一个连续的数字比较,可以与其他信用卡日期进行比较。或者,您只需将其转换为int currentdate = Integer.parseInt(dateformat.format(date)); Date,然后使用日期比较。

此外,您应该将变量Calendar设为布尔值。您无需将其作为数值。

答案 4 :(得分:-2)

你可以替换expnum.nextInt(); with Integer.parseInt(expnum.nextLine());这将获取输入字符串,并将其转换为int。如果他们没有放一个int,它会通过一个异常,所以你可以把它放在一个try-catch语句中(并把它放在while循环中或类似的东西所以它一直询问,直到他们回答如果你想要正确的格式。)