2011-01-17 49 views
3

ユーザーが入力した誕生日(好ましくは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

私はJoda timeを使用してお勧めしたいです。 JDKに含まれるAPIよりもはるかに優れたAPIです。

生年月日を表すInstantを作成し、現在時刻を表す別のInstantを作成してPeriodを作成します。そこから、Periodクラスで提供されるmethodsを使用して、必要なフィールドを簡単に取得できます。

1

いくつかの方法があります。 クラスを使用して、今日と生年月日の間のデルタを表すjoda-timeを使用します。それはあなたが望む正確な能力を提供します。

サードパーティのライブラリを扱いたくない場合は、問題の2つの日付を表す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日?)と、うるう年と夏時間とタイムゾーンの処理方法。個人的には、私はジョーダタイムを守ります。
3

java.time

、後のJava 8とに組み込まれjava.timeフレームワークを使用します。例はTutorial(小さな変更を加えたもの)から直接貼り付けられたコピーです。あなたは53年、4ヶ月と29日齢ある

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

コードは、次のような出力を生成します。

私の意見では、時間、分、秒を出力するのは理にかなっていません。DBにこのような正確なデータが含まれていない可能性が高いからです。そのため、例ではLocalDateTimeの代わりにLocalDateが使用されます。

関連する問題