在java中查找出生日期

时间:2014-09-09 08:55:44

标签: java date

大家好我正在创建一个程序,用于在确切年龄给出时查找出生日期。例如,如果一个男人的年龄是21岁10个月和22天(截至当前日期),我怎样才能找到确切的出生日期。如果有人帮助我isuue,我将感激不尽。

我试过的就是这里。

这里d,m和y是几个月和几年的文本字段。

  private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            int da = Integer.parseInt(d.getText());
            da = -da;
            int mo = Integer.parseInt(m.getText());
            mo = -mo;        
            int ye = Integer.parseInt(y.getText());
            ye = -ye;
            SimpleDateFormat ddd = new SimpleDateFormat("dd");
            SimpleDateFormat mmm = new SimpleDateFormat("MM");
            SimpleDateFormat yyy = new SimpleDateFormat("yyyy");
            Calendar cal = Calendar.getInstance();                       
            cal.getTime();
            cal.add(Calendar.DATE, da);
             cal.set(Integer.parseInt(yyy.format(cal.getTime())), Integer.parseInt(mmm.format(cal.getTime())), Integer.parseInt(ddd.format(cal.getTime())));
            cal.add(cal.MONTH, mo);cal.set(Integer.parseInt(yyy.format(cal.getTime())), Integer.parseInt(mmm.format(cal.getTime())), Integer.parseInt(ddd.format(cal.getTime())));
            cal.add(cal.YEAR, ye);
            System.out.println(getDate(cal));
        }

我的问题是,如果我输入21年10个月和22天作为一个人的年龄,编制者给出的日期是18/12/1992但实际日期应该是17/10/1992。 请帮我解决这个问题。

4 个答案:

答案 0 :(得分:6)

以下是Date & Time API实施的Java 8解决方案:

int dobYear = 21;
int dobMonth = 10;
int dobDay = 22;

LocalDate now = LocalDate.now();
LocalDate dob = now.minusYears(dobYear)
        .minusMonths(dobMonth)
        .minusDays(dobDay);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
System.out.println(dob.format(formatter));

输出:18/10/1992

答案 1 :(得分:3)

    int da = 22;
    int mo = 10;
    int ye = 21;

    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.YEAR, -ye);
    cal.add(Calendar.MONTH, -mo);
    cal.add(Calendar.DAY_OF_YEAR, -da);

    System.out.println(cal.getTime());

答案 2 :(得分:1)

您要先减去天数,然后减去几个月和最后几年。这在我看来是错误的,因为你不知道多年来可能有多少闰年。

尝试

Calendar cal = Calendar.getInstance();                       
cal.add(Calendar.YEAR, ye);   
cal.add(Calendar.MONTH, mo);  
cal.add(Calendar.DAY_OF_MONTH, da); 

这样做我得到:Sun Oct 18 11:24:52 CET 1992

答案 3 :(得分:1)

不要重新发明轮子。使用合适的日期时间库进行日期时间工作。

约达时间

您可以使用Joda-Time在两行易于阅读的代码中完成您的任务。

时间跨度

Joda-Time库支持定义一段时间。提供三个类:间隔,期间和持续时间。为此,我们需要Period

ISO 8601

Joda-Time在解析/生成字符串时使用ISO 8601标准作为其默认值。该标准通过这种方式为durations(Joda-Time称之为Period)定义了这种格式:PnYnMnDTnHnMnSP启动每个实例,T将日期部分与时间部分分开。您可以使用此类字符串构建Period对象,也可以传递数年,月,日等数字。

时区

如果您想要更准确,您应该指定您的年 - 月 - 天数计算的时区。结果可能会有所不同,因为日期取决于时区。新的一天在巴黎早些时候比在蒙特利尔开始。

示例代码

Joda-Time 2.4中的示例代码。

LocalDate now = LocalDate.now( DateTimeZone.forID( "America/Montreal" ) );
Period age = new Period( "P21Y10M22D" ); // 21 years, 10 months, and 22 days. Or: new Period( 21, 10, 22…
LocalDate birth = now.minus( age );

转储到控制台。

System.out.println( "now: " + now );
System.out.println( "age: " + age );
System.out.println( "birth: " + birth );

跑步时。

now: 2014-09-10
age: P21Y10M22D
birth: 1992-10-19