2012-07-25 155 views
1

这是我的代码,我有一个简单的问题,它应该是什么样子IF语句条件

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声明中做错了吗?

+1

检查['Date.compareTo']的javadocs(http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#compareTo%28java.util.Date% 29),它不能保证是>或<范围的值,只是>或<0 – 2012-07-25 06:04:07

+1

我是* sooo *添加[tag:homework]标签... – Bohemian 2012-07-25 06:13:12

+0

我们是否有类似的问题几天之前? – MadProgrammer 2012-07-25 06:32:47

回答

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())); 
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. 
} 

你将不得不小心处理边缘情形(你应该包括和区间的两端等),但这应该做为方法。

+0

啧啧,我们在这里试图不告诉他答案;) – MadProgrammer 2012-07-25 06:14:14

+1

@MadProgrammer我通常避免只把答案告诉给家庭作业。这似乎是人们必须在工作中完成的完全有效的任务。如果我对某些语言没有经验,但我需要知道如何处理它,我宁愿得到一个答案而不是小费,因为理解小费可能需要更长的时间,然后自己提出一个解决方案。 – 2012-07-25 06:18:10

+0

干草,这里没有问题,但学习如何解决问题的最好方法之一是先从一点开始,看看它在哪里。 JMO – MadProgrammer 2012-07-25 06:32:09

1

我觉得你的整个逻辑是关闭的。您应该根据日期today + nYears而不是expiryDate + nYears比较信用卡到期日。

看看Date.afterDate.equalsDate.before

0

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

返回: 值0,如果该参数日期等于这个日期;如果此日期在Date参数之前,则值小于0;如果此Date在Date参数之后,则值大于0。

但是这并不能为您提供几年的差异。它会给你只有-1,0或1.

作为一个解决方案,你需要提取一年的日期,然后进行比较。