【问题标题】:how to calculate age or difference between two dates in java如何在java中计算两个日期之间的年龄或差异
【发布时间】:2013-12-23 16:23:17
【问题描述】:

我想得到两个日期之间的月数。日期是某人的生日和当前日期。所以我得到两个日期之间的年数,而不是月数..

假设我的日期是 06/09/201106/11/2012。所以我希望答案是 1 年 2 个月。我得到了年份,但没有月份。请帮忙。下面是获取年数的代码

 public int getAge(Date dateOfBirth)      {                                                                                                                                                                         

    today = Calendar.getInstance(); 
    Calendar birthDate = Calendar.getInstance();

    birthDate.setTime(dateOfBirth);
    if (birthDate.after(today)) {
        throw new IllegalArgumentException("Can't be born in the future");
    }

    age = today.get(Calendar.YEAR) - birthDate.get(Calendar.YEAR);
    month = today.get(Calendar.MONTH) - birthDate.get(Calendar.MONTH);

    if ( (birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3) ||
            (birthDate.get(Calendar.MONTH) > today.get(Calendar.MONTH ))){
        days = birthDate.get(Calendar.DAY_OF_MONTH) - today.get(Calendar.DAY_OF_MONTH);
        age--;

        Toast.makeText(getApplicationContext(), "inside if", Toast.LENGTH_SHORT).show();
        Log.e("month is",month+"");
        Log.e("Days",days+ " left");


    }else if ((birthDate.get(Calendar.MONTH) == today.get(Calendar.MONTH )) &&
              (birthDate.get(Calendar.DAY_OF_MONTH) > today.get(Calendar.DAY_OF_MONTH ))){
        Toast.makeText(getApplicationContext(), "inside else if", Toast.LENGTH_SHORT).show();

        age--;
    }

    return age;

【问题讨论】:

标签: java date date-difference


【解决方案1】:

Joda Time 有代码可以完成所有这些以及更多操作

您可以执行以下操作来获取两个日期之间的月份:

Calendar startCalendar = new GregorianCalendar();
startCalendar.setTime(startDate);
Calendar endCalendar = new GregorianCalendar();
endCalendar.setTime(endDate);

int diffYear = endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR);
int diffMonth = diffYear * 12 + endCalendar.get(Calendar.MONTH) - startCalendar.get(Calendar.MONTH);

查看Link

注意:如果您的日期是 2013-01-312013-02-01,那么您将获得 1 个月的距离,这可能是您想要的,也可能不是。

【讨论】:

  • 你说的是总时间以月为单位,但我想要以月和日为单位的年龄,比如你的年龄是 22 岁 5 个月 23 天
【解决方案2】:

我最近创建了一个演示并上传了here

它使用JodaTime 库来获得有效的结果。

希望对你有用。

截图:

代码:

MainActivity.java

public class MainActivity extends Activity {

    private SimpleDateFormat mSimpleDateFormat;
    private PeriodFormatter mPeriodFormat;

    private Date startDate;
    private Date endDate;
    private Date birthDate;


    private TextView tvStartDate,tvEndDate,tvDifferenceStandard,tvDifferenceCustom,tvBirthDate,tvAgeStandard,tvAgeCustom;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();

        //determine dateDiff
        Period dateDiff = calcDiff(startDate,endDate);
        tvDifferenceStandard.setText(PeriodFormat.wordBased().print(dateDiff));
        tvDifferenceCustom.setText( mPeriodFormat.print(dateDiff));


        //determine age
        Period age = calcDiff(birthDate,new Date());
        tvAgeStandard.setText(PeriodFormat.wordBased().print(age));
        tvAgeCustom.setText( mPeriodFormat.print(age));

    }

    private void init() {

        //ui
        tvStartDate = (TextView)findViewById(R.id.tvStartDate);
        tvEndDate = (TextView)findViewById(R.id.tvEndDate);
        tvDifferenceStandard = (TextView)findViewById(R.id.tvDifferenceStandard);
        tvDifferenceCustom = (TextView)findViewById(R.id.tvDifferenceCustom);
        tvBirthDate = (TextView)findViewById(R.id.tvBirthDate);
        tvAgeStandard = (TextView)findViewById(R.id.tvAgeStandard);
        tvAgeCustom = (TextView)findViewById(R.id.tvAgeCustom);



        //components
        mSimpleDateFormat = new SimpleDateFormat("dd/MM/yy");
        mPeriodFormat = new PeriodFormatterBuilder().appendYears().appendSuffix(" year(s) ").appendMonths().appendSuffix(" month(s) ").appendDays().appendSuffix(" day(s) ").printZeroNever().toFormatter();


        try {
            startDate = mSimpleDateFormat.parse(tvStartDate.getText().toString());
            endDate =  mSimpleDateFormat.parse(tvEndDate.getText().toString());
            birthDate = mSimpleDateFormat.parse(tvBirthDate.getText().toString());

        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private Period calcDiff(Date startDate,Date endDate)
    {
        DateTime START_DT = (startDate==null)?null:new DateTime(startDate);
        DateTime END_DT = (endDate==null)?null:new DateTime(endDate);

        Period period = new Period(START_DT, END_DT);

        return period;

    }

}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >


<TextView 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Date Diff Calculator"
    android:textStyle="bold"
    android:gravity="center"
    android:background="@android:color/darker_gray"
    />


<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textStyle="bold"
    android:text="Start Date:" />

<TextView
    android:id="@+id/tvStartDate"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="06/09/2011" />

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textStyle="bold"
    android:text="End Date:" />

<TextView
    android:id="@+id/tvEndDate"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="29/10/2013" />

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textStyle="bold"
    android:text="Difference (Standard)" />

<TextView
    android:id="@+id/tvDifferenceStandard"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="result" />

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textStyle="bold"
    android:text="Difference (Custom)" />

<TextView
    android:id="@+id/tvDifferenceCustom"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="result" />


<TextView 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Age Calculator"
    android:textStyle="bold"
    android:gravity="center"
    android:background="@android:color/darker_gray"
    />

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textStyle="bold"
    android:text="Birth Date:" />

<TextView
    android:id="@+id/tvBirthDate"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="01/09/1989" />

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textStyle="bold"
    android:text="Age (Standard)" />

<TextView
    android:id="@+id/tvAgeStandard"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="result" />

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textStyle="bold"
    android:text="Age (Custom)" />

<TextView
    android:id="@+id/tvAgeCustom"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="result" />

注意:

1) 不要忘记add JodaTime library到你的项目

2) 正如您在布局文件中看到的,我使用了"Start Date","End Date" to calculate Date Difference 的固定值和"Birth Date" to calculate Age 的固定值。你可以replace it with your dynamic values

【讨论】:

  • 这里没有代码示例。我不必导航到另一个站点(可能被我的工作关闭或阻止的站点)来查看您的答案。
  • 很好的解决方案,你只是忘记了 appendWeeks().appendSuffix(" week(s) ")
  • @AviParshan 是的,我这样做是为了解释自定义格式化程序,标准格式的周参数已经存在:)
【解决方案3】:

java.time

因为这个答案是从here引用的…

使用java.time 课程,您可以非常轻松地计算年龄:

long years = ChronoUnit.YEARS.between(LocalDate.of(1900, Month.NOVEMBER, 20), LocalDate.now());

或(如果您需要年份和月份)

Period p = Period.between(birthday, today);
p.getYears();
p.getMonths();

要计算整个期间的所有月份,如问题中所述,请致电toTotalMonths

int totalMonths = p.toTotalMonths();

【讨论】:

    【解决方案4】:

    年龄可以通过一种非常简单的方式计算出来。以下是我完整的java代码。

     public class age {
    
    
        public static void main(String [] args){
            Scanner s=new Scanner(System.in);
            Date dd=new Date();
            int d=Integer.parseInt(new SimpleDateFormat("dd").format(dd));
            int m=Integer.parseInt(new SimpleDateFormat("MM").format(dd));
            int y=Integer.parseInt(new SimpleDateFormat("yyyy").format(dd));
             System.out.println( "Enter Day ");
            int d1=Integer.parseInt(s.nextLine());
            System.out.println( "Enter Month ");
            int m1=Integer.parseInt(s.nextLine());
             System.out.println( "Year");
            int y1=Integer.parseInt(s.nextLine());
            if(d<d1){
                d+=30;
                m-=1;
            }
            if(m<m1){
                m+=12;
                y-=1;
            }
          System.out.println((y-y1)+" years "+(m-m1)+"  month "+(d-d1)+" days ");
    
        }
     }
    

    【讨论】:

      猜你喜欢
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      相关资源
      最近更新 更多