質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

1015閲覧

[Java]生年月日を渡したら年齢を計算するプログラム

fall

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/04/22 10:33

引数として生年月日を渡したらそれを元に年齢を計算するプログラムを作りです。
引数のパターンは以下の3つのみから計算させるようにしたいです。
・yyyy/MM/dd
・yyyy.MM.dd
・yyyyMMdd
数値以外の値が入った場合、未来の日付が指定された場合はエラーにします。
以下のコードまでは書けましたが、tryの部分の処理が出来ていません。
ご教示いただければ幸いです。

Java

1import java.time.LocalDate; 2import java.time.format.DateTimeFormatter; 3import java.time.format.DateTimeParseException; 4import java.time.temporal.ChronoUnit; 5 6public class Age { 7 public static void main(String[] args) { 8 9 if (args.length != 1) { 10 System.err.println("err"); 11 System.exit(1); 12 return; 13 } 14 15 DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy/MM/dd"); 16 DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy.MM.dd"); 17 DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyyMMdd"); 18 19 // LocalDateを取得 20 LocalDate birthDate; 21 22 try { 23 birthDate = LocalDate.parse(args[0], formatter1); 24 } 25 catch ( DateTimeParseException e) { 26 System.err.println("err"); 27 System.err.println(e); 28 System.exit(1); 29 return; 30 } 31 32 // 現在の日付を取得 33 LocalDate nowDate = LocalDate.now(); 34 35 if (nowDate.compareTo(birthDate) >= 0) { 36 // 年齢を計算 37 long age = ChronoUnit.YEARS.between(birthDate, nowDate); 38 // 年齢を出力 39 System.out.println("年齢:" + age +); 40 System.exit(0); 41 } 42 else { 43 System.err.println("err"); 44 System.exit(1); 45 } 46 } 47} 48

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/04/22 10:36

どこの学校ですか?
退会済みユーザー

退会済みユーザー

2020/04/23 04:32

あれ同じ質問4っつめ?タイトルに見覚えが
guest

回答1

0

現状は、ただ書いただけでロジックを考えていない状態だと思われます。
今のソースでtry~catchの穴埋め”だけ”で、やりたいことを実現できる状態ではありません。

端的いうと、書き直しが必要です。

前回の回答でループを使った判定方法の参考もありますし、
まずは、フローを整理してみはどうでしょうか。

書式が3つあるのでtry~catchを3回書くのは、あまりオススメしません。
※パースを3回書くと、それぞれでパースエラーと未来日付の確認が必要(関数化してもいいけどフローは、見づらいと思います。)

書式のチェック(パースはしない)
書式のエラーなら処理を終了
書式がOKなら、パース(前回の質問で数字8桁なら、どんな書式でもパースできますよね?)
日付が未来日付でないことを確認
以下略

みたいな流れが、書式チェック、妥当性チェック、メイン処理という感じなので
私個人の感覚では一般的だと思います。

投稿2020/04/23 04:27

編集2020/04/23 04:31
momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問