日付時刻の扱いにJavaの難しさが凝集されている

日付がわかっててDateクラスのオブジェクトが得たいとき、一番便利なのはDateクラスのコンストラクタに日付を渡して「new Date("2007/6/28")」とすることなんですけど、このコンストラクタは非推奨になってます。
でも、日付からDateオブジェクトを得る方法として、一番わかりやすいのはコンストラクタに指定する方法です。
設計ポリシーのために一番わかりやすい利用法が使えないというのが、Javaのそこかしこをちょっとずつ難しくして、全体を難しくしています。


まあ、ちゃんとわかってる人がテストとか一時的なコードで仮の日付が欲しいときには適当に使っちゃってかまわないのですが、初心者向けの文章には使うことができません。
で、代替案として、CalendarかDateFormatを使う必要があります。数値で日付が指定されているときはCalendar、文字列で日付が指定されているときはDateFormatという使い分けが必要になります。
Javaのクラスの使い分けがわからないうちはJavaのクラスを使い分けて使わないといけない、ということになってるのです。


まあ、クラスの使い分けはがまんするとして、DateFormatで文字列→日付の変換をすると、例外処理が必要になります。例外処理は、初心者が苦手とする文法のひとつです。

try{
  Date d = DateFormat.getDateInstance().parse("2007/6/28");
}catch(ParseException ex){
}


そしてCalendarの場合、DateオブジェクトをsetTimeしてから日付操作を行ったり、日付を設定してからDateオブジェクトを得るという2段階の操作が必要になります。
そのとき、設定メソッドは戻り値を返さないので、必ず一旦変数にCalendarを割り当てておく必要があります。そのため、必ず3行のコードが必要になります。

Calendar c = Calendar.getInstance();
c.set(2008, 6, 28);
Date d = c.get();


Dateの加工はもっと面倒です。1ヶ月後を表示するには次のようなコードが必要になります。

Date d = new Date();
Calendar c = Calendar.getInstance();
c.set(d);
c.add(Calendar.MONTH, 1);
System.out.println(c.get());