前回はインターフェースを扱いました。流れ的に次はラムダ式かStreamかと思ったのですが、
まとめるのが難しいので先に箸休めでTimeクラスを紹介します。
さて、Dateクラス使うの面倒臭いと思いませんか。
日付処理をしようとするとCalendarクラスを使わないといけないし、
差分とかとっていろいろしたいけど…、
という要望に答えた、CalenerクラスとDateクラス(+α)を統合した
のがJava 8からのTimeクラスです。
DateTime
時間を表すクラスには、いくつかあります。
代表的なのは、
LocalDateTime : タイムゾーンを含まない、日時
ZonedDateTime : タイムゾーンを含む、日時
になります。
ほかにもいろいろ追加されてますが、ここではLocalDateTimeを扱います。
日付処理
今日の3時のDateクラスを作成したいとなった時に今までは、
Calendarクラスを使っていました。
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 3);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
Date date = cal.getTime();
LocalDateTimeでは、クラスに日付処理が組み込まれているので、
Calendarのようなクラスを呼ぶ必要はありません。
LocalDateTime datetime = LocalDateTime.now()
.withHour(3).withMinute(0).withSecond(0).withNano(0);
指定日時のDateも作成しやすくなりました。
LocalDateTime datetime1 = LocalDateTime.of(2014, 5, 21, 1, 12);
一行で書けます。Javaではちょっと前から、一行で書くというのに
狂信的な人たちがいますね。
日付差分
Dateクラスは比較がafter,beforeくらいだったのですが
Java 8からは、専用のクラスが追加されてかなり拡張されています。
むしろこちらの方が嬉しい
ふたつのLocalDateTimeクラスの差分をDurationクラスで表せます。
Duration duration = Duration.between(datetime, datetime1);
このdurationは、datetimeからdatetime1までのナノ秒を保持しています。
LocalDateTimeクラスに、plusすることでdurationの秒数を追加できます。
LocalDateTime datePlused = datetime.plus(duration);
他にもminusとかできます。
Durationがあると、C#のTimeSpanのようなことができます。
この記事の内容をTimeSpanからDurationに置き換えると次のようになる。
public static final TimeSpan TIMESPAN = TimeSpan.Days(7);
↓
Duration duration1 = Duration.ofDays(1);
で現在と差分を足したDateを求めるには、
Date date = TIMESPAN.getDate(new Date());
↓
now.plus(duration1);
とすればいい。
何に利用するかというと主に
Memcachedに渡すExpireの 定義とかです。
Memcached.get(key, new Memgetable<String>() {
public String get() {
return value;
}
}, TIMESPAN.getDate(new Date()));
↓
Memcached.get(key, () -> {
return value;
}, Date.from(now.plus(duration1).toInstant());
こんな風に記述ができます。
まだ、*DateTimeに対応してないのでDateに直さないといけないのが面倒
つづく
0 件のコメント:
コメントを投稿