月の数値表現
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
参考資料
- ZonedDateTime (Java Platform SE 8 )
- Calendar (Java Platform SE 8 )
- ほんとうに便利だった業務で使えるJava SE8新機能(JJUG CCC 2015 Spring)
tags: java
Posted by NI-Lab. (@nilab)