这是我的代码,我有一个简单的问题
import java.util.*;
import java.io.*;
import type.lib.GlobalCredit;
import type.lib.CreditCard;
import java.text.SimpleDateFormat;
public class eCheck08A
{
public static void main(String[] args)
{
PrintStream out = System.out;
Scanner in = new Scanner(System.in);
GlobalCredit credit1 = new GlobalCredit().getRandom();
out.print("Enter report range in years ... ");
int range = in.nextInt();
out.println("Cards expiring before " + range + " year(s) from now: ");
SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
for (CreditCard cc : credit1)
{
Calendar c = Calendar.getInstance();
c.setTime(cc.getExpiryDate());
c.add(Calendar.YEAR, range);
Date newDate = c.getTime();
if (cc.getExpiryDate().compareTo(newDate) < range)
{
if(cc.getExpiryDate().compareTo(newDate) > range)
{
out.print("*");
}
out.print(cc.getNumber());
out.println("\t" + sf.format(cc.getExpiryDate()));
}
}
}
}
输出应该是什么样子:
Enter report range in years ... 3
Cards expiring before 3 years from now:
561561-8 20/11/2015
045645-7 22/02/2017
456462-3 16/04/2013 *
546548-5 19/08/2016
今年是2012年 该人输入'3'作为范围。 所以从2012年到2015年的任何一年都应该有一个“*”。与上面的输出一样,2013年有一个“*”。 你能否在我的IF声明中说出我做错了什么?
答案 0 :(得分:1)
compareTo方法不会返回您期望的内容。只保证在第一个参数较小时返回负数,如果大于正数则返回正数,如果它们相等则返回零。
编辑:以下是您可以更改代码的方式:
Date now = new Date(System.currentTimeMillis());
Date endDate = new Date(now.getTime());
endDate.SetYear(endDate.getYear() + 3);
if (cc.getExpiryDate().after(now) && cc.ExpiryDate.before(endDate)) {
// do stuff.
}
你必须小心处理边缘情况(如果你包括间隔的末尾等等),但这应该作为方法。
答案 1 :(得分:1)
如果您要将cc.getExpiryDate()
与当前日期+范围进行比较,则希望newDate
为:
Calendar c = Calendar.getInstance();
// commenting this line out because getInstance() gives us the current date already
// c.setTime(cc.getExpiryDate());
c.add(Calendar.YEAR, range);
Date newDate = c.getTime();
此newDate
比当前日期提前了几年。现在,您可以开始比较cc.getExpiryDate()
值:
// expiry date is BEFORE the date + "range" years ahead
if (cc.getExpiryDate().compareTo(newDate) < 0)
{
// the expiry date is AFTER or ON the current date
if(cc.getExpiryDate().compareTo(new Date()) >= 0)
{
out.print("*");
}
}
out.print(cc.getNumber());
out.println("\t" + sf.format(cc.getExpiryDate()));
答案 2 :(得分:1)
我认为你的整个逻辑都是关闭的。您应该根据today + nYears
的日期而不是expiryDate + nYears
来比较信用卡到期日期。
查看Date.after
,Date.equals
,Date.before
答案 3 :(得分:0)
查看Date.compareTo()方法的java文档...
返回: 如果参数Date等于此Date,则值为0;如果此Date在Date参数之前,则小于0的值;如果此Date位于Date参数之后,则值大于0.
但这并没有为您提供多年的差异。它只会给你-1,0或1。
作为一种解决方案,您需要从日期中提取年份,然后进行比较。