2014年1月23日木曜日

Java 8を使ってみる (Timeクラス編)

Java 8を使ってみよう 3回目は、Timeクラスです。


前回はインターフェースを扱いました。流れ的に次はラムダ式か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 件のコメント: