我想计算患者的年龄。主要问题是计算Java Time之前出生的患者。该代码在Java控制台应用程序中工作正常,但在基于JSF和JPA的实体中失败。我只在实体中记录出生数据,年龄是一个过渡属性。我不知道为什么相同的代码在Java EE应用程序中不起作用。

public String getAge() {
    System.out.println("getting age");
    if (person == null) {
        System.out.println("patient is null");
        age = "";
        return age;
    }
    if (person.getDob() == null) {
        System.out.println("dob is null");
        age = "";
        return age;
    }
    System.out.println("this = " + this);
    System.out.println("Person = " + Person);

    Date dob = person.getDob();
    System.out.println("dob = " + dob);

    if (dob == null) {
        System.out.println("dob is null");
        age = "";
        return age;
    }


    long temAge;
    long dobTime = dob.getTime();
    System.out.println("dobTime = " + dobTime);
    long nowTime = Calendar.getInstance().getTime().getTime();
    System.out.println("nowTime = " + nowTime);

    if (dobTime < 0) {
        System.out.println("dobTime = " + dobTime);
        temAge = (nowTime + Math.abs(dobTime));
        System.out.println("nowTime = " + nowTime);
        System.out.println("Math.dob = " + Math.abs(dobTime));
        System.out.println("temAge = " + temAge);
        temAge = temAge / (1000 * 60 * 60 * 24);
        System.out.println("temAge = " + temAge);
        System.out.println("age in days before is minus. now age in days is " + temAge);
    } else {
        temAge = (nowTime - dobTime) / (1000 * 60 * 60 * 24);
        System.out.println("age in days before is minus. now age in days is " + temAge);
    }
    if (temAge < 60) {
        age = temAge + " days";
    } else if (temAge < 366) {
        age = (temAge / 30) + " months";
    } else {
        age = (temAge / 365) + " years";
    }
    System.out.println("age is " + age);
    return age;
}


编辑:

经过考沙尔的答案后,我更改了代码。与jodatime合作真的很容易。感谢Kaushal的帮助。

public static String getAge() {
        LocalDate birthdate = new LocalDate(getDob());
        LocalDate now = new LocalDate();
        Years ageInYears;
        ageInYears = Years.yearsBetween(birthdate, now);
        if (ageInYears.getYears() > 0) {
            return ageInYears.getYears() + " Years";
        } else {
            Months ageInMonths = Months.monthsBetween(birthdate, now);
            if (ageInMonths.getMonths() > 0) {
                return ageInMonths.getMonths() + " Months";
            } else {
                Days ageInDays = Days.daysBetween(birthdate, now);
                return ageInDays.getDays() + " Days";
            }
        }
    }

最佳答案

如果可能,请尝试使用jodatime。它是一个非常好的约会工具。

public static void main(String[] args) {
    LocalDate birthdate = new LocalDate (1958, 1, 20);
    LocalDate now = new LocalDate();
    Years age = Years.yearsBetween(birthdate, now);
    System.out.println(age.getYears());
}


您的意思是失败了。您得到一些错误或无效的年龄吗?

09-13 00:57