Chris V.
Chris V.

Reputation: 41

Calculate age in Years, Months, Days, Hours, Minutes, and Seconds

I need to take a birthday entered by the user (preferably in dd/mm//yyyy format) and find their age, based on todays date. Could someone explain to me the process I should go through to find this? I need to print it out in the format:

"You are 19 years, 4 months, 12 days, 8 hours, 44 minutes, and 39 seconds old."

I'm just a little confused on how I would subtract a date from another date, and how I would reference each part (years, months, days, hours, etc) separately.

The code I have at the moment for reference:

import java.sql.Date;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;

public class Driver {

    public Driver(){}

    public static void main( String[] args){
    Driver menu = new Driver();
    MenuOptions option;
    do{
        menu.displayMenu();
        option = menu.getResponse();
        menu.runOption(option);
    }while(option != MenuOptions.Quit);  
    }

    private enum MenuOptions{
    AgeCalc("Calculate your age"),
        AnniversaryCalc("Calculate time until specified date"),
        AgeDifference("Find the time between two specified dates"),
        Quit("Exit the program");

    private String value;

    private MenuOptions(String value){
        this.value = value;
    }

    public String toString(){
        return value;
    }
    }

    public void displayMenu(){
    for(MenuOptions option : MenuOptions.values()){
        System.out.printf("%5d: %s\n", option.ordinal()+1, option);
    }
    }

    public MenuOptions getResponse(){
    int value = -1;
    Scanner input = new Scanner(System.in);

    do{
        System.out.println("> ");
        String response = input.nextLine();

        if(response.matches("\\d+")){
        value = Integer.parseInt(response);
        if(value < 1 || value > MenuOptions.values().length){
            value = -1;
            System.out.println("Unknown response, please enter a number between 1 and " +MenuOptions .values().length);
        }
        }

    }while(value <=0);

    return MenuOptions.values()[value-1];
    }

    public void runOption(MenuOptions option){
    Scanner in = new Scanner(System.in);

    switch(option){
    case AgeCalc:
        System.out.println("Please enter your birthday mm/DD/yyyy).");
        System.out.println(">");

        DateFormat df = new SimpleDateFormat("mm/DD/yyyy");

        try
        {
            java.util.Date birthday = df.parse(in.nextLine());           
            System.out.println("Today = " + df.format(birthday));
        } catch (ParseException e)
        {
            e.printStackTrace();
        }
        Calendar today = Calendar.getInstance();
        java.util.Date today = df.format();

        DateFormat simple = new SimpleDateFormat("dd/MM/yyyy");
        String birthdate = simple.format(in.nextLine());
        Date.parse(birthdate);

        System.out.println(birthdate.toString());
        break;
    case AnniversaryCalc:
        System.out.printf("PI: %.20f\n", Math.PI);
        break;
    case AgeDifference:
        for(int p=0; p <= 32; p++){
        System.out.println("2^" +p+" = " +Math.pow(2,p));
        }
    }
    }
}

Upvotes: 4

Views: 24474

Answers (4)

Ilya Budu
Ilya Budu

Reputation: 129

public class Main {
    public static void main(String[] args) {
    LocalDateTime dateTime = LocalDateTime.of(2018, 12, 27, 11, 45, 0);
            Duration showSeconds = AgeCalculator.calculateAgeDuration(dateTime, LocalDateTime.now());
            TimeConverter.calculateTime(showSeconds.getSeconds());
    }
}

public class AgeCalculator {
    public static Duration calculateAgeDuration(LocalDateTime dayBefore, LocalDateTime currentDay) {
            return Duration.between(dayBefore, currentDay);
    }
}

public class TimeConverter {
    public static void calculateTime(long timeSeconds) {
        long days = timeSeconds / 86400; // 24*60*60
        long hours = timeSeconds / 3600;
        long minutes = (timeSeconds % 3600) / 60;
        long seconds = (timeSeconds % 3600) % 60;

        System.out.println("Days: " + days);
        System.out.println("Hours: " + hours);
        System.out.println("Minutes: " + minutes);
        System.out.println("Seconds: " + seconds);
    }
}

Days: 0 Hours: 4 Minutes: 30 Seconds: 29

Upvotes: 0

Przemek Piotrowski
Przemek Piotrowski

Reputation: 7486

java.time

Using the java.time framework built into Java 8 and later. Example is copy pasted directly from Tutorial (with small modifications).

import java.time.Period
import java.time.LocalDate
import java.time.format.DateTimeFormatter

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy");    
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.parse("1/1/1960", formatter);


Period p = Period.between(birthday, today);
System.out.println("You are " + p.getYears() + " years, " + p.getMonths() +
                   " months and " + p.getDays() +
                   " days old.");

The code produces output similar to the following:

You are 53 years, 4 months and 29 days old.

In my opinion it doesn't make sense to output hour, minutes and seconds because you probably won't have such precise data in your DB. That is why example uses LocalDate instead of LocalDateTime.

Upvotes: 4

Stewart Murrie
Stewart Murrie

Reputation: 1319

There are a couple of ways. I would use joda-time, using the Period class to represent the delta between today and the date of birth. It provides exactly the capability you want.

If you don't want to deal with a 3rd party library, then get Date objects representing the two dates in question and call getTime() on both, subtract the latest from the earliest and you'll have the delta between the dates in milliseconds. The maths to convert that into years/months/days etc is trivial.* Something like:

delta /= 1000;  // convert ms to s
if (delta > 60 * 60 * 24 * 365) // number of seconds in a year
    int years = delta / (60 * 60 * 24 * 365) // integer division to get the number of years
    delta %= (60 * 60 * 24 * 365) // assign the remainder back to delta
// repeat ad nauseum
  • When I say trivial, I mean seemingly straightforward but full of tricky details, like what the definition of a month is (30 days? 365/12 days?) and how you deal with leap years and daylight savings and timezones. Personally, I'd stick with joda-time.

Upvotes: 1

Brad Mace
Brad Mace

Reputation: 27916

I'd suggest using Joda time. It's a much better API than what's included in the JDK.

Create an Instant representing when the person was born, another representing the current time, and use those two Instants to create a Period. From there it's easy to get the fields you need using the methods provided in the Period class.

Upvotes: 5

Related Questions