1

这是我的代码,我有一个简单的问题

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 语句中做错了什么吗?

4

4 回答 4

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.
}

您必须小心处理边缘情况(如果您包括间隔结束等),但这应该作为方法。

于 2012-07-25T06:05:37.670 回答
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()));
于 2012-07-25T06:12:44.587 回答
1

我认为你的整个逻辑都是错误的。您应该根据日期比较信用卡到期日期today + nYears,而不是expiryDate + nYears.

看看Date.after,,,Date.equals_Date.before

于 2012-07-25T06:13:03.290 回答
0

看看 Date.compareTo() 方法的java文档...

返回: 如果参数 Date 等于此 Date,则值为 0;如果此 Date 在 Date 参数之前,则值小于 0;如果此 Date 在 Date 参数之后,则值大于 0。

但这并不能为您提供多年的差异。它只会给你-1、0或1。

作为一种解决方案,您需要从日期中提取年份,然后进行比较。

于 2012-07-25T06:15:41.327 回答