KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

Java Tips -=-= Library =-=- JodaTime [後半]

LINEで送る
[`evernote` not found]
Pocket

今月から数回に分けて、利用価値の高いJava Libraryを紹介していこうと思います。
今回ご紹介するのは日付操作に必要不可欠なライブラリ【JodaTime】を前半、後半の2回に分けて紹介していきます。
前半
– DateTime class
後半
– Interval class
– Duration class
– Period class
– サンプル : 応用

JodaTimeについて

JodaTimeとはJavaの日付操作を簡単にしたクラス群で、
日付の取得、設定、フォーマット、比較、加減算、差分など豊富な機能があり、今や必須ライブラリの一つです。
– DateTime class
– Interval class
– Duration class
– Period class
# Java8であればTimeAPIがありますが、個人的にはJodaTimeの方が使いやすいです。

– License:
Apache 2.0

– Home Page:
http://www.joda.org/joda-time/

– Maven repository:
https://mvnrepository.com/artifact/joda-time/joda-time

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.9.7</version>
</dependency>

– Java doc:
http://www.joda.org/joda-time/apidocs/index.html

Samples : Interval class
期間はDateTimeオブジェクトから生成し、2つの期間を比較する事ができます。

– インポート

import org.joda.time.Interval;

– Interval.abuts() : 2つの期間が隣り合っているか確認する

	DateTime dt = new DateTime(2001, 1, 1, 0, 0, 0);
	Interval interval1 = new Interval(dt, dt.plusDays(1));
	// => 2001-01-01T00:00:00.000+09:00/2001-01-02T00:00:00.000+09:00
	Interval interval2 = new Interval(dt.plusDays(1), dt.plusDays(2));
	// => 2001-01-02T00:00:00.000+09:00/2001-01-03T00:00:00.000+09:00

	assertTrue(interval1.abuts(interval2));

	Interval interval3 = new Interval(dt.plusDays(1).plusSeconds(1), dt.plusDays(2));
	// => 2001-01-02T00:00:01.000+09:00/2001-01-03T00:00:00.000+09:00

	assertFalse(interval1.abuts(interval3));

– Interval.gap() : 2つの期間の隔たりを取得することができます。

	DateTime dt = new DateTime(2001, 1, 1, 0, 0, 0);
	Interval interval1 = new Interval(dt, dt.plusDays(1));
	// => 2001-01-01T00:00:00.000+09:00/2001-01-02T00:00:00.000+09:00
	Interval interval2 = new Interval(dt.plusDays(1), dt.plusDays(2));
	// => 2001-01-02T00:00:00.000+09:00/2001-01-03T00:00:00.000+09:00

	assertNull(interval1.gap(interval2));
	// => not gap

	Interval interval3 = new Interval(dt.plusDays(1).plusSeconds(1), dt.plusDays(2));
	// => 2001-01-02T00:00:01.000+09:00/2001-01-03T00:00:00.000+09:00

	assertThat(interval1.gap(interval3).toDurationMillis(), is(1000L));

– Interval.overlap() : 2つの期間の重なりを取得することが出来ます。

	DateTime dt = new DateTime(2001, 1, 1, 0, 0, 0);
	Interval interval1 = new Interval(dt, dt.plusDays(10));
	// => 2001-01-01T00:00:00.000+09:00/2001-10-02T00:00:00.000+09:00
	Interval interval2 = new Interval(dt.plusDays(1), dt.plusDays(10));
	// => 2001-01-02T00:00:00.000+09:00/2001-01-10T00:00:00.000+09:00

	assertThat(interval1.overlap(interval2).toDuration().getStandardDays(), is(9L));

Samples : Duration class
期間の取得ができます。plus/minusメソッドで期間の操作ができます。

– インポート

import org.joda.time.Duration;
	DateTime dt = new DateTime(2001, 1, 1, 0, 0, 0);
	Duration duration = new Duration(dt, dt.plusMonths(1).plusDays(10).plusHours(20));

	assertThat(duration.getStandardDays(), is(41L));
	assertThat(duration.getStandardHours(), is(1004L));
	assertThat(duration.getStandardMinutes(), is(60240L));
	assertThat(duration.getStandardSeconds(), is(3614400L));

	// 期間を1時間伸ばす
	duration = duration.plus(60L * 60L * 1000L);
	assertThat(duration.getStandardHours(), is(1005L));

Samples : Period class
期間を年、月、週や日といった単位で操作することができる。

– インポート

import org.joda.time.Period;
	DateTime dt = new DateTime(2001, 1, 1, 0, 0, 0);
	Period period = new Period(dt, dt.plusMonths(1).plusDays(2).plusHours(3).plusMinutes(4).plusSeconds(5));
	assertThat(period.getYears(), is(0));
	assertThat(period.getMonths(), is(1));
	assertThat(period.getDays(), is(2));
	assertThat(period.getHours(), is(3));
	assertThat(period.getMinutes(), is(4));
	assertThat(period.getSeconds(), is(5));

Samples : 応用

– 始まりと終わりの取得

	DateTime dt = new DateTime(2001, 5, 10, 0, 0, 0);

	// 年初・年末
	assertThat(dt.dayOfYear().withMinimumValue().toString("yyyy-MM-dd"), is("2001-01-01"));
	assertThat(dt.dayOfYear().withMaximumValue().toString("yyyy-MM-dd"), is("2001-12-31"));

	// 月初・月末
	assertThat(dt.dayOfMonth().withMinimumValue().toString("yyyy-MM-dd"), is("2001-05-01"));
	assertThat(dt.dayOfMonth().withMaximumValue().toString("yyyy-MM-dd"), is("2001-05-31"));

	// 週初め・週末
	assertThat(dt.dayOfWeek().withMinimumValue().toString("yyyy-MM-dd"), is("2001-05-07"));
	assertThat(dt.dayOfWeek().withMaximumValue().toString("yyyy-MM-dd"), is("2001-05-13"));

– タイムゾーン関連

DateTime.withZone(): タイムゾーンを変更して、時刻の変換も行う。

	DateTime dt = new DateTime(2001, 1, 1, 0, 0, 0);

	// TimeZone: Asia/Tokyo +09:00 (Default)
	assertThat(dt.toString(), is("2001-01-01T00:00:00.000+09:00"));
	assertThat(dt.getZone().getID(), is("Asia/Tokyo"));

	// TimeZone: UTC +00:00
	dt = dt.withZone(DateTimeZone.UTC);
	assertThat(dt.toString(), is("2000-12-31T15:00:00.000Z"));
	assertThat(dt.getZone().getID(), is("UTC"));

	// TimeZone: US/Hawaii +00:00
	dt = dt.withZone(DateTimeZone.forID("US/Hawaii"));
	assertThat(dt.toString(), is("2000-12-31T05:00:00.000-10:00"));
	assertThat(dt.getZone().getID(), is("Pacific/Honolulu"));

DateTime.withZoneRetainFields(): タイムゾーンを変更を行う、時刻の変更は行わない。

	DateTime dt = new DateTime(2001, 1, 1, 0, 0, 0);

	// TimeZone: Asia/Tokyo +09:00 (Default)
	assertThat(dt.toString(), is("2001-01-01T00:00:00.000+09:00"));
	assertThat(dt.getZone().getID(), is("Asia/Tokyo"));

	// TimeZone: UTC +00:00
	dt = dt.withZoneRetainFields(DateTimeZone.UTC);
	assertThat(dt.toString(), is("2001-01-01T00:00:00.000Z"));
	assertThat(dt.getZone().getID(), is("UTC"));

以上JodaTimeの基本クラスのサンプルと、応用編のサンプルのご紹介でした。
次回はLombokをご紹介したいと思います。

【関連記事】
Google App Engine 第一回
Google App Engine 第二回
Javaのライブラリを手軽にテストしたい!! Groovy入門 第1回
Google App Engine 第三回
Google App Engine 第四回
Google App Engine 第五回
Google App Engine 第六回
Google App Engine 第七回
Google App Engine 第八回
Google App Engine 第九回
Google App Engine 第十回
Google App Engine 第十一回
Google App Engine 第十二回
AngularJS入門01
AngularJS入門02
AngularJS入門03
AngularJS入門04
AngularJS入門05
AngularJS入門06
AngularJS入門07
AngularJS入門08
AngularJS入門09
攻略 Elevator Saga =基本編=
攻略 Elevator Saga =応用編=
Java Tips -=-= Library =-=- JodaTime [前半]

LINEで送る
[`evernote` not found]
Pocket