how to calculate age or difference between two dates in java

20,202

I have recently created a demo and uploaded here.

It is using JodaTime library for efficient results.

I hope it will be useful.

Screenshot:

screenshot

Code:

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" />

Note:

1) don't forget to add JodaTime library to your project

2) As you can see in layout file, I have used fixed value for "Start Date","End Date" to calculate Date Difference and fixed value for "Birth Date" to calculate Age. You may replace it with your dynamic values.

Share:
20,202
XylemRaj
Author by

XylemRaj

Android Dev

Updated on July 21, 2022

Comments

  • XylemRaj
    XylemRaj almost 2 years

    I want to get the number of months between 2 dates.The dates are someones birthday and the current date.So i m getting the number of years in between the two dates but not the number of months..

    Suppose my dates are 06/09/2011 and 06/11/2012.So i want the answer to be 1yr 2mths .I am getting the year but not the month.Please help.Below is the code for getting the number of years

     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;
    
  • XylemRaj
    XylemRaj over 10 years
    What you are saying is the total time in months but i want the age in months and days like Your Age is 22 yrs 5 mths 23 days
  • Danny
    Danny over 9 years
    There is no code example here. I shouldn't have to navigate to another site (one that may be down or blocked by my work) to see your answer.
  • A P
    A P almost 6 years
    Great solution, you just forgot appendWeeks().appendSuffix(" week(s) ")
  • Mehul Joisar
    Mehul Joisar almost 6 years
    @AviParshan Yeah, I did that intentionally to explain custom formatter, weeks parameter is already there in standard format :)