月の数値表現

Calendar クラスでは、月の数値表現が 0-11 だったので、1月=0, 2月=1, 3月=2 という直感的でなく、まぎらわしいものだった。

ZonedDateTime クラスでは、月の数値表現が 1-12 になった。これで、1月=1, 2月=2, 3月=3 というわかりやすいものになった。

public int getMonthValue()

月フィールドを取得します(1-12)。

このメソッドは、月を1-12のintとして返します。getMonth()を呼び出すことで列挙型Monthが使用される場合は、アプリケーション・コードがより明確になることが多くなります。

戻り値: 月(1-12)

ZonedDateTime (Java Platform SE 8 )

ZonedDateTime は内部状態を変更しない

Calendar クラスでは、日時を進めるメソッドを呼ぶとオブジェクトの内部状態が更新されたけど、 ZonedDateTime では内部状態を更新せずに、新しい ZonedDateTime オブジェクトを返してくれる。

状態が変化しない Immutable なオブジェクトを使うことで、プログラムが堅牢になりやすい (バグを減らしやすい)。

オブジェクトがミュータブルであると、参照コピーのテクニックはずっと困難になる。なぜなら、ミュータブルなオブジェクトの参照を保持する者が1人でもオブジェクトに変更を加えると、参照を共有する者全員がその影響を受けるからである。

(中略)

イミュータブルなオブジェクトはマルチスレッドプログラミングにおいても有用となる。データがイミュータブルなオブジェクトで表現されていると、複数のスレッドが他のスレッドにデータを変更される心配なくデータにアクセスできる。つまり排他制御の必要がない。よってイミュータブルなオブジェクトのほうがミュータブルなものよりスレッドセーフであると考えられる。

イミュータブル - Wikipedia

Calendar と ZonedDateTime のサンプルコード


import java.util.Calendar;
import java.time.ZonedDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class Sample{

  public static void main(String[] args){

    // java.util.Calendar

    // 現在日時
    Calendar cal = Calendar.getInstance();
    System.out.println(cal.getTime());

    // 日時指定
    // 年,月,日,時,間,秒
    cal.set(2015, 1, 2, 3, 4, 5);
    System.out.println(cal.getTime());

    // 10日進める
    cal.add(Calendar.DAY_OF_MONTH, 10);
    System.out.println(cal.getTime());

    // java.time.ZonedDateTime

    // 現在日時
    ZonedDateTime zdt = ZonedDateTime.now();
    System.out.println(zdt.format(DateTimeFormatter.RFC_1123_DATE_TIME));

    // 日時指定
    // 年,月,日,時,間,秒,ナノ秒,タイムゾーン
    zdt = ZonedDateTime.of(
      2015, 1, 2, 3, 4, 5, 0,
      ZoneId.of("JST", ZoneId.SHORT_IDS));
    System.out.println(zdt.format(DateTimeFormatter.RFC_1123_DATE_TIME));

    // 10日進める
    zdt = zdt.plusDays(10);
    System.out.println(zdt.format(DateTimeFormatter.RFC_1123_DATE_TIME));
  }
}

実行結果。


Tue Apr 14 12:10:35 JST 2015
Mon Feb 02 03:04:05 JST 2015
Thu Feb 12 03:04:05 JST 2015
Tue, 14 Apr 2015 12:10:35 +0900
Fri, 2 Jan 2015 03:04:05 +0900
Mon, 12 Jan 2015 03:04:05 +0900

参考資料

tags: java

Posted by NI-Lab. (@nilab)