Рассчитать возраст в годах, месяцах, днях, часах, минутах и ​​секундах - PullRequest
4 голосов
/ 17 января 2011

Мне нужно взять день рождения, введенный пользователем (желательно в формате dd/mm//yyyy), и определить его возраст на основе сегодняшней даты. Может ли кто-нибудь объяснить мне процесс, который я должен пройти, чтобы найти это? Мне нужно распечатать его в формате:

"Вам 19 лет, 4 месяца, 12 дней, 8 часов, 44 минуты и 39 секунд."

Я просто немного запутался, как вычесть дату из другой даты и как я буду ссылаться на каждую часть (годы, месяцы, дни, часы и т. Д.) Отдельно.

Код, который у меня есть на данный момент для справки:

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));
        }
    }
    }
}

Ответы [ 4 ]

5 голосов
/ 17 января 2011

Я бы предложил использовать Время Joda .Это намного лучший API, чем то, что включено в JDK.

Создайте Instant , представляющий, когда человек родился, другой, представляющий текущее время, и используйте эти два Instant s, чтобы создать Period .Оттуда легко получить нужные поля, используя методы , предоставленные в классе Period.

3 голосов
/ 20 декабря 2015

java.time

Использование платформы java.time, встроенной в Java 8 и более поздние версии. Пример - копия, вставленная непосредственно из Tutorial (с небольшими изменениями).

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.");

Код производит вывод, подобный следующему:

Вам 53 года, 4 месяца и 29 дней.

По моему мнению, не имеет смысла выводить часы, минуты и секунды, потому что у вас, вероятно, не будет таких точных данных в вашей БД. Вот почему в примере используется LocalDate вместо LocalDateTime.

1 голос
/ 17 января 2011

Есть несколько способов.Я бы использовал joda-time , используя класс Period для представления дельты между сегодняшним днем ​​и датой рождения.Он предоставляет именно ту возможность, которую вы хотите.

Если вы не хотите иметь дело со сторонней библиотекой, то получите Date объекты, представляющие две рассматриваемые даты, и вызовите getTime() в обе, вычтитепоследний из самых ранних, и у вас будет дельта между датами в миллисекундах.Математика для преобразования этого в годы / месяцы / дни и т. Д. Тривиальна. * Что-то вроде:

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
  • Когда я говорю тривиально, я имею в виду, казалось бы, простой, но полный каверзных деталей, как, например, определениемесяца (30 дней? 365/12 дней?) и как вы справляетесь с високосными годами, летним временем и часовыми поясами.Лично я бы придерживался йода-тайм.
0 голосов
/ 27 декабря 2018
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);
    }
}

Дни: 0 Часы: 4 Минуты: 30 Секунды: 29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...