Java8の日付・時刻クラス

現在のJavaで日付を扱うには、java.util.Dateクラスかjava.util.Calendarクラスまたは両方を使わないといけない。

これが結構面倒で、どうして.NETのように簡単に扱えないのか非常に不満であった。

Java8ではこれらを置き換えるため、新たに、java.timeパッケージが導入されるようである。Javadocを見る限りでは、DateやCalendarよりは使いやすいように思える。が、未だに日時どうしの演算ができないのはなぜだろうか?

.NETでは日付型(DateTime)どうしで、減算を行うと、TimeSpan(相対時間)型を得ることができるし、DateTimeにTimeSpanを加減算することも可能である。

もちろん、Javaでは演算子のオーバーロードができないことは承知しているが、メソッドとして用意しても良いのではないか?確かに、addDays,addHoursやminusDays,minusHours等のメソッドはあるが、単純な(日時型どうしの)減算位できても良いのではないだろうか?

まぁ、無いものは仕方ないので、とりあえず、新しいLocalDateTimeクラスの使用例を挙げておく。

↑DurationやPeriodクラスのstaticメソッドを使うと計算できる模様。

import java.time.*;
import java.time.format.*;
class localdt {
 public static void main(String[] args) {
  // 現在日時を取得
  LocalDateTime dt = LocalDateTime.now();
  // フォーマットを指定して文字列化
  System.out.printf("現在時刻は%sです。\n",
    dt.toString(
    dt.format(
    DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")));
  // 2012/2月の最後の日は?
  LocalDate dt2 =
    LocalDate.of(2012,3,1);    // 年月日指定でLocalDateを得る
  dt2 = dt2.minusDays(1);        // 1日マイナスする
  System.out.printf("2012年2月の最後の日は%sです\n",
    dt2.toString(
    dt2.format(
      DateTimeFormatter.ofPattern("yyyy/MM/dd")));
  // 1964/02/03生まれの人の年齢は?
  LocalDate now = LocalDate.now();
  // 今度は文字列からparseしてみよう
  LocalDate birth = LocalDate.parse(
    "1964/02/03",
    DateTimeFormatter.ofPattern("yyyy/MM/dd"));
  // 年月日を取り出すメソッドを使用する。
  // この辺りはやはりpropertyを実装しているC#とかに較べると
  // コードがだっさー
  int age = now.getYear() - birth.getYear();
  int nm = now.getMonthValue();
  int bm = birth.getMonthValue();
  int nd = now.getDayOfMonth();
  int bd = now.getDayOfMonth();
  age -= (nm < bm ? 1
    : (nm == bm && nd < bd ) ? 1 : 0);
  // これで計算できるそうです。(実際試したらできました)
  int age = Period.between(birth,now).getYar();
  System.out.printf("1964/02/03生まれの人は%d才だね\n",age);
 }
}

実行結果

Java8 LocalDateTime実行結果

Java8 LocalDateTime実行結果

たけぞう

たけぞう について

某ソフトウェア開発会社勤務。 開発の仕事は卒業しますた。 ・・・と思ったら、また開発に逆戻り(^^; ・・・と思ったら、また卒業らしい・・・
カテゴリー: Java, 技術情報 パーマリンク

Java8の日付・時刻クラス への2件のフィードバック

  1. ゆっち のコメント:

    age = Period.between(birth, LocalDate.now()).getYears();
    これでどうでしょうか?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です