入力した年月日が過去か現在か未来かを表示するプログラム

このQ&Aのポイント
  • 「SimpleDateFormat」クラスを活用して入力した年月日が過去か現在か未来かを判断するプログラムを作成する方法についての質問です。
  • 添削問題の解答では、フォーマット形式を設定して入力日付と現在日付を比較し、比較結果に応じて結果を表示します。
  • 比較には「compareTo()」メソッドを使い、0より大きい場合は後の日付、0の場合は同じ日付、0より小さい場合は前の日付と判断します。
回答を見る
  • ベストアンサー

入力した年月日が過去か現在か未来かを表示するプログラム その2

実は、 http://oshiete1.goo.ne.jp/qa4722681.html これは添削問題だったんですね。 まず自分がある一部分しかソースコードを記述しなかったのがいけなかったのかもしれませんが、添削問題の解答は以下のようなものでした。 //「SimpleDateFormat」クラスを活用できていませんよ。 //上記ままだと、処理のタイミングによっては現在日付を入力しても //違う日付と判断されてしまいますよ。(秒まで管理しているものが比較対照のため) //以下のよう少しシンプルに記述することが出来ますよ。 で、問題のところですね。 //フォーマット形式を設定します。 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); //Dateクラスに変換したコンソール日付を年月日形式に整形します。 String result1 =sdf.format(myCal.getTime()); Calendar myToday = Calendar.getInstance(); //Dateクラスに変換した現在日付を年月日形式に整形します。 String result2 =sdf.format(myToday.getTime()); if (result1.compareTo(result2)== 0) { System.out.println("現在日付と同じ日付です。"); }else if (result1.compareTo(result2)> 0){ System.out.println("現在日付よりも後の日付です。"); }else if (result1.compareTo(result2)< 0){ System.out.println("現在日付よりも前の日付です。"); やはり<>=のような比較演算子を使うみたいです。 でも、compareTo()メソッドは初めて知りました。 後、どういう計算で0より大きいのか、小さいのかを表すのかは、未だに分かりません。 before()メソッドとafter()メソッドを使うよりいいんですかね。 分かる方がいましたら、教えて頂けると大変有り難いです。 どうぞ宜しくお願い致します。 後、ソースコードとかで足りない部分がありましたら言って下さい。 その部分は補足のところに書かせてもらいます。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

この問題は「SimpleDateFormat」を勉強した後に 「SimpleDateFormat」を使って解けという問題なのかな? 次のような回答でOKかな? compareToを使っているif文において 20090101よりも20090201の方が未来である という判定は 文字列の並び順で 20090101よりも20090201の方が後に来るという 性質を利用して判定しているのだ。 年月日を表している文字列が あくまで同じ桁数だから、 というのが前提条件だけど。 --ここまで--ここからちょっと愚痴-- 勉強としては、正直あまりお勧めできない実装。 まったくオブジェクト指向的じゃないし。 オブジェクト指向的に解決するなら beforやafterを使うべき。 正直なとこ、こんな問題初心者にやらせるなよと言いたい。 ただ、ひとつの判定の手段として 日付を文字列に置き換えて 文字列の順序の前後の判定を利用する方法もある と覚えておけばいいよ。 実際良く使われるけどね。 前述したけど、年月日を表している文字列が 同じ桁数だから、というのが前提条件。 で、compareToというメソッドは オブジェクトに順序を決定づけるための Comparableインターフェースの持つメソッドだよ。 s1.compareTo(s2) の結果は 0より大きい、0、0より小さいのいずれかで 0より大きい場合、s1はs2より後ろにあるという意味。 0より小さければ、s1はs2より前にあるという意味。 0ならばs1とs2は同じ位置にあるという意味。 Comparableはそのうち勉強するといいよ。 ちなみにbefore,afterはCalendarだけじゃなくDateでもできる。 もちろんDateでcompareToもあるよ。 日付の比較なんだから、こっちがいいね。 まあ、設問じゃ仕方ないけど。

persona
質問者

お礼

分かりやすい解説をして頂き、感謝します。 意味不明だったのが、askaaskaさんのおかげでこの頭の悪い自分でも理解できました。 納得して理解できるというのは嬉しいもんですね。 しかも、有り難いエールのようなお言葉にまた頑張るぞ!!!という気持ちの高ぶりを感じました。

関連するQ&A

  • 入力した年月日が過去か現在か未来かを表示するプログラム

    import java.util.*; import java.io.*; import java.text.*; 大事なところだけ抜粋。 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int year = Integer.parseInt(br.readLine()); int month = Integer.parseInt(br.readLine()); int day = Integer.parseInt(br.readLine()); Calendar cal = Calendar.getInstance(); cal.set(year,month-1,day); Calendar today = Calendar.getInstance(); SimpleDateFormat sbf = new SimpleDateFormat("yyMMdd"); Date date1 = cal.getTime(); Date date2 = today.getTime(); String result1 = sbf.format(cal); String result2 = sbf.format(today); 問題はここからです。 入力した年月日が過去か現在か未来か調べるのに<>=は使えないですよね。 どうすればいいのでしょうか。 アドバイス、宜しくお願い致します。

    • ベストアンサー
    • Java
  • 和暦変換フォーマット用メソッドについて

    private void 生年月日編集(String 生年月日, PrintWriter out) { SimpleDateFormat sdf1 = new SimpleDateFormat(生年月日); sdf1.setLenient(false); Date d = sdf1.parse("20120705", new ParsePosition(0)); SimpleDateFormat sdf2 = new SimpleDateFormat("GGGGyyyy年M月d日", new Locale("ja", "JP", "JP")); System.out.println(sdf2.format(d)); 上記の和暦変換プログラムを フォーマット用メソッドとして和暦変換プログラムを呼び だすようにしたいのですが うまくいきません。 アドバイスよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 文字列から読み込んだ時刻の操作について。

    こんにちは。お時間のある時にお願いします。 文字列表記された時刻を、ある特定のフォーマットに変換し、尚且つタイムゾーンの計算をして、ソートさせるプログラムを組んでいます。 時間の加減算には、Calenderクラス、 String型からDate型に変換するには、SimpleDateFormatクラスが良さそうだ、と思って触っています。 ----- String strPreTime = "Sun, 11 Dec 2005 03:00:38 +0900"; //変換後時刻フォーマット -> 2005-12-11T03:00:38+0900 SimpleDateFormat sdf = new SimpleDateFormat(); sdf.setDateFormatSymbols(new DateFormatSymbols(Locale.US)); //日付の出力形式を設定 sdf.applyPattern("EEE, d MMM yyyy HH:mm:ss Z"); Date dat = sdf.parse(strPreTime); System.out.println("test1: "+dat); sdf.applyPattern("yyyy-MM-dd'T'HH:mm:ssZ"); String dat2 = sdf.format(dat); System.out.println("test2: " +dat2); ----- 出力結果: test1: Sun Dec 11 03:00:38 JST 2005 test2: 2005-12-11T03:00:38+0900 となりますが、test1の出力結果が、sdf.applyPattern("EEE, d MMM yyyy HH:mm:ss Z");で指定した出力形式になっておらず、頭を悩ませています。 どこを直せば、指定した通りの出力形式になるのか、教えてください。 また、Date型の時にタイムゾーンだけを抽出する、というのはどうしたらいいでしょうか?

    • ベストアンサー
    • Java
  • 日付チェックについて。

    文字列の日付妥当性チェックについて、SimpleDateFormat#parseをいままで使っていました。 先日、末尾が英字でも例外が発生しないことに気づきました。 途中に存在するともちろん例外が発生します。 例) public static void main(String[] args) { Date date = null; SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); sdf.setLenient(false); try { date = sdf.parse("2000011a"); // ←例外がスローされない。 // date = sdf.parse("200001a1"); ←例外がスローされる。 } catch (Exception e) { System.out.println("exception"); return; } System.out.println(date); } 末尾に英字があってもOKなのは仕様なのでしょうか? このことがわかった後はparseの前にInteger.parseInt(date)を呼び出して、数字であることをチェックしてから日付妥当性を確認しています。 文字列を分割してCalenderクラスのgetTime()などで妥当性チェックを行うことも可能とは思いますが、どうにも納得できな挙動だったので質問させて頂きました。 グーグル先生に教えてもらおうとしたのですが、このことに触れられているサイトが見当たらず・・・ご存知の方がいらっしゃいましたら教えて頂けないでしょうか。 ※JDKのバージョンは1.4と1.5で確認いたしました。

    • ベストアンサー
    • Java
  • javaのプログラムの質問です

    2つの時間を取得し、それらの時差を計算しそれに*300をし結果を出力するプログラムを作っています。 workspace.java package org.parking.java; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; class Parking { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Date dateTo1 = null; Date dateTo2 = null; private long dayDiff; public Parking() { try{ dateTo1 = sdf.parse("2017/09/14 10:00:00"); dateTo2 = sdf.parse("2017/09/15 09:00:00"); System.out.println("パーキングシステムを作りました。"); } catch (ParseException e){ e.printStackTrace(); } } public void setParking(Date dateTo1,Date dateTo2)// { long dateTimeTo = dateTo1.getTime(); long dateTimeFrom = dateTo2.getTime(); this.dayDiff = (dateTimeFrom - dateTimeTo)/(1000*60*60); } public void show() { System.out.println("日数(FROM) : " + sdf.format(dateTo1)); System.out.println("日数(TO) : " + sdf.format(dateTo2)); System.out.println("差分時間: " + this.dayDiff); System.out.println("納車してから"+ this.dayDiff +"時間が経ちましたので料金は"+ (this.dayDiff*300) +"となります。"); } } Parkingsub.java package org.parking.java; class Sample1 { public static void main(String[] args) { Parking parking1 = new Parking(); parking1.show(); } }  これで一応実行はできるんですけど、実行結果が パーキングシステムを作りました。 日数(FROM) : 2017/09/14 10:00:00 日数(TO) : 2017/09/15 09:00:00 差分時間: 0 納車してから0時間が経ちましたので料金は0となります。  となってしまうんです。いろいろやってみたんですがなかなか上手く行かなくて・・・。どなたかご教授願えませんしょうか。

    • ベストアンサー
    • Java
  • java.util.Dateについて

    まずは下記ソースを参照してください。 import java.util.Date; import java.util.GregorianCalendar; import java.util.Calendar; public class Test{     public static void main( String args[] ){         GregorianCalendar cal = new GregorianCalendar(2004, 5, 31);         System.out.println("年:" + cal.get(Calendar.YEAR));         System.out.println("月:" + cal.get(Calendar.MONTH));         System.out.println("日:" + cal.get(Calendar.DAY_OF_MONTH));         System.out.println(); // ただの改行         System.out.println("比較:" + new Date().compareTo(cal.getTime()));     } } 上記ソースについて質問です。 1.「年」「月」「日」を表示しておりますが、本来ならば 「年:2004」 「月:5」 「日:31」 と表示されると思っておりましたが実際は、 「年:2004」 「月:6」 「日:1」 と表示されてしまいます。 なぜでしょうか? 2.12行目にてjava.util.DateクラスのcompareToメソッドを用いて、 現在日付(2004/5/28)と7行目で指定している日付の比較をしていますが、 7行目で設定している日付を現在日付よりも前後に設定して実行させても、 「-1」しか返りません。 なぜでしょうか? 環境は、 J2SDK:1.4.2 OS:Windows XP Pro です。

    • ベストアンサー
    • Java
  • ファイル名を動的に生成したい

    ファイル名を日付とその日の中の通し番号にしたいと思っています。 例えば2009/07/17日だったらファイル名を 20090717+その日の中の通し番号とする。 日付をファイル名にするところまではできたのですが「その日の中の 通し番号とする」部分がわかりませんので教えていただきたいのですが。 import java.text.SimpleDateFormat; import java.util.Date; public class CreateFileName { public static void main(String args[]){ Date date1 = new Date(); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd"); //ファイル名は日付とその日の中の通し番号 String fileName = sdf1.format(date1).toString()+".pdf"; System.out.println(fileName); } }

  • JAVA  ログファイル名について

    現在、ログファイル用ディレクトリを出力する際に、ログファイル名用日付フォーマットを使用し、処理日付時間の形式で表示させるように設定しています。 SimpleDateFormat resultDirFormatter = new SimpleDateFormat("yyyyMMddhhmmss"); String today = resultDirFormatter.format(cal.getTime()); if (doWriteDetails) { File dir = new File("./result/TableDiffDetails/" + today); dir.delete(); dir.mkdirs(); } これを、日付+番号で作成されるようにしたいのです。 20060124072252 を 20060124_01 にしたい。 同じ日に作成された場合は、番号が1ずつ更新される。 01 02 03 ・・・・・・ 現在、サーブレット上で作成しています。 以上、宜しくお願致します。

  • Date型

    下記のコード内で、「20060618」設定して、出力を「2006年6月18日」としたいのですが、やり方がわかりません。わかる人がいましたらよろしくお願いいたします。また、Date型というのはどのような型のことを言うのでしょうか?初心者的な質問だと思いますがよろしくお願いいたします。 import java.util.*; import java.text.*; class Test { public static void main(String[] args) { Date date1 = new Date(); // Date date1 = format.parse("20011010"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy'年'MM'月'dd'日'"); System.out.println(sdf1.format(date1)); } }

    • ベストアンサー
    • Java
  • importが分からない

    importが違うせいだと思いますが、コンパイルできるように直してください。 import java.util.Date; import java.text.SimpleDateFormat; import java.util.Locale; public class a {  public static void main (String args[]) {   Date d = calendar.getTime();   SimpleDateFormat f = new SimpleDateFormat("EEE", Locale.JAPANESE);   String s = f.format(d);   System.out.println(s);  } }

専門家に質問してみよう