Java:日历算法不起作用

Java:日历算法不起作用,java,calendar,Java,Calendar,我想知道一个人的年龄,如果我有生日和现在。我要做的是从生日中减去年份。本年度为2014年。我的生日样本是1960年,但它返回0而不是53 public class Person implements java.io.Serializable { private static final long serialVersionUID = 7056942232246992667L; String fname, mname, lname, houseNum, street, city,

我想知道一个人的年龄,如果我有生日和现在。我要做的是从生日中减去年份。本年度为2014年。我的生日样本是1960年,但它返回0而不是53

public class Person implements java.io.Serializable {
    private static final long serialVersionUID = 7056942232246992667L;
    String fname, mname, lname, houseNum, street, city, state, country;
    ArrayList<String> schools = new ArrayList<String>();
    int age, yr, mt, dy;
    String zipCode, ssn, id;
    static Calendar bday;

    public Person(String fnamei, String mnamei, String lnamei, int yri, int mti, int  dyi, String houseNumi, String streeti, String cityi, String statei, String zipi, String countryi, String idset) {
        fname = fnamei; mname = mnamei; lname = lnamei; yr = yri; mt = mti; dy = dyi;
        houseNum = houseNumi; street = streeti;
        city = cityi; state = statei; zipCode = zipi; country = countryi;
        id = idset; age = -1;
        bday = new GregorianCalendar(yr, mt, dy);

        GregorianCalendar currDate = new GregorianCalendar();
        GregorianCalendar thisYearBDay = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), mt, dy);
        int thisYear = Calendar.getInstance().get(Calendar.YEAR);
        age = thisYear - yr;
        if (currDate.before(thisYearBDay)) {
            age--;
        }
    }
    public int getAge() {
        System.out.println(Calendar.getInstance().get(Calendar.YEAR)); //2014
        System.out.println(bday.getInstance().get(Calendar.YEAR)); //1960
        return age; //0? Should be 53/54
    }
你在打电话吗

bday.getInstance().get(Calendar.YEAR) // 1960
getInstance()
是一个
static
方法,它返回一个新的
Calendar
对象。您可以在实例上调用
static
方法,但正是出于这个原因,我们强烈建议不要这样做


您在初始化到今天(即2014年)的新实例上调用
get(int)
,而不是在
bday
引用的实例上调用

2014
2014
53
“如预期”

线路

System.out.println(bday.getInstance().get(Calendar.YEAR)); //1960
打印2014,因为
bday.getInstance()
创建了日历的新实例。要打印出生年份,请使用

System.out.println(bday.get(Calendar.YEAR)); //1960
另一个建议是声明接口而不是具体类,例如:

List<String> schools = new ArrayList<String>(); 
Calendar currDate = new GregorianCalendar();
List schools=new ArrayList();
日历currDate=新的GregorianCalendar();

你用什么值来创建
Person
对象?@SotiriosDelimanolis我编辑了它。每次我看到日期时间问题,我都会感叹“JodaTime”。你知道,如果yri=2014,那么年龄将为零,我想……你能澄清你的问题是什么吗?那么是2014:-)[但你知道为什么]是的。这很有帮助。谢谢
List<String> schools = new ArrayList<String>(); 
Calendar currDate = new GregorianCalendar();