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 : DateTime class

– インポート

import org.joda.time.DateTime;

– コンストラクタ

	// Current Timestamp => 2017-01-01T00:00:00.000+09:00
	DateTime dt;
	dt = new DateTime();
	dt = DateTime.now();

	System.out.println(dt.toString());
	// => 2017-01-01T00:00:00.000+09:00

両書式とも現在日付を元にインスタンスを作成します。

	dt = new DateTime(2000, 1, 23, 12, 34, 56);
	assertThat(dt.toString(), is("2000-01-23T12:34:56.000+09:00"));

年月日時分秒を指定して、インスタンスを作成します。

– parse() : パース

	dt = DateTime.parse("2000-01-02T12:34:56");
	assertThat(dt.toString(), is("2000-01-23T12:34:56.000+09:00"));

文字列を変換してインスタンスを作成します。

	dt = DateTime.parse("20000102123456", DateTimeFormat.forPattern("yyyyMMddHHmmss"));
	assertThat(dt.toString(), is("2000-01-23T12:34:56.000+09:00"));

フォーマットに沿って文字列を変換しインスタンスを作成します。

– getXXX() : 年月日時分秒をパートごとに取得

DateTimeから各パート毎に値を取りだします。

	DateTime dt = DateTime.parse("2000-01-02T12:34:56");
	assertThat(dt.getYear(), is(2000)); // 年
	assertThat(dt.getMonthOfYear(), is(1)); // 月
	assertThat(dt.getDayOfMonth(), is(2)); // 日
	assertThat(dt.getHourOfDay(), is(12)); // 時
	assertThat(dt.getMinuteOfHour(), is(34)); // 分
	assertThat(dt.getSecondOfMinute(), is(56)); // 秒
	assertThat(dt.getZone(), is(DateTimeZone.forID("Asia/Tokyo"))); // タイムゾーン

– toString() : 文字列変換

	DateTime dt = DateTime.parse("2000-01-02T12:34:56");
	assertThat(dt.toString(), is("2000-01-02T12:34:56.000+09:00"));
	assertThat(dt.toString("yyyyMMddHHmmss"), is("20000102123456"));

– DateTimeZone : タイムゾーン

	DateTime dt = new DateTime(DateTimeZone.forID("Asia/Taipei"));
	System.out.println(dt.toString());
	// => 2016-12-31T23:00:00.000+08:00

コンストラクターでタイムゾーンの指定が可能です。
上記の例ではタイムゾーンを台湾に指定しています。

– plusXXX() : 年月日時分秒の加算

	DateTime dt = new DateTime(2000, 1, 1, 0, 0, 0);
	assertThat(dt.toString(), is("2000-01-01T00:00:00.000+09:00"));

	// plusYears(1) : 年+1
	assertThat(dt.plusYears(1).toString(), is("2001-01-01T00:00:00.000+09:00"));
	// plusMonths(1) : 月+1
	assertThat(dt.plusMonths(1).toString(), is("2000-02-01T00:00:00.000+09:00"));
	// plusDays(1) : 日+1
	assertThat(dt.plusDays(1).toString(), is("2000-01-02T00:00:00.000+09:00"));
	// plusHours(1) : 時+1
	assertThat(dt.plusHours(1).toString(), is("2000-01-01T01:00:00.000+09:00"));
	// plusMinutes(1) : 分+1
	assertThat(dt.plusMinutes(1).toString(), is("2000-01-01T00:01:00.000+09:00"));
	// plusSeconds(1) : 秒+1
	assertThat(dt.plusSeconds(1).toString(), is("2000-01-01T00:00:01.000+09:00"));

上記の例では年月日時分秒それぞれに1ずつ加算しています。

– minusXXX() : 年月日時分秒の減算

	DateTime dt = new DateTime(2010, 10, 10, 10, 10, 10);
	assertThat(dt.toString(), is("2010-10-10T10:10:10.000+09:00"));

	// minusYears(1) : 年-1
	assertThat(dt.minusYears(1).toString(), is("2009-10-10T10:10:10.000+09:00"));
	// minusMonths(1) : 月-1
	assertThat(dt.minusMonths(1).toString(), is("2010-09-10T10:10:10.000+09:00"));
	// minusDays(1) : 日-1
	assertThat(dt.minusDays(1).toString(), is("2010-10-09T10:10:10.000+09:00"));
	// minusHours(1) : 時-1
	assertThat(dt.minusHours(1).toString(), is("2010-10-10T09:10:10.000+09:00"));
	// minusMinutes(1) : 分-1
	assertThat(dt.minusMinutes(1).toString(), is("2010-10-10T10:09:10.000+09:00"));
	// minusSeconds(1) : 秒-1
	assertThat(dt.minusSeconds(1).toString(), is("2010-10-10T10:10:09.000+09:00"));

上記の例では年月日時分秒それぞれに1ずつ減算しています。

– withXXX() : 年月日時分秒の部分設定

	DateTime dt = new DateTime(2000, 1, 1, 0, 0, 0);
	assertThat(dt.toString(), is("2000-01-01T00:00:00.000+09:00"));
	
	// withYear(2016) : 年を2016に設定したコピーを返す
	assertThat(dt.withYear(2016).toString(), is("2016-01-01T00:00:00.000+09:00"));
	// withMonthOfYear(12) : 月を12に設定したコピーを返す
	assertThat(dt.withMonthOfYear(12).toString(), is("2000-12-01T00:00:00.000+09:00"));
	// withDayOfMonth(31) : 日を31に設定したコピーを返す
	assertThat(dt.withDayOfMonth(31).toString(), is("2000-01-31T00:00:00.000+09:00"));
	// withTime(12, 34, 56, 00) : 時分秒を12:34:56.000に設定したコピーを返す
	assertThat(dt.withTime(12, 34, 56, 00).toString(), is("2000-01-01T12:34:56.000+09:00"));
	DateTime dt = new DateTime(2010, 10, 10, 10, 10, 10);
	assertThat(dt.toString(), is("2010-10-10T10:10:10.000+09:00"));

	// withTimeAtStartOfDay() : 一日の始まりの時間を設定したコピーを返す
	assertThat(dt.withTimeAtStartOfDay().toString(), is("2010-10-10T00:00:00.000+09:00"));

– isXXX() : 比較

	DateTime dt1 = new DateTime(2000, 1, 1, 0, 0, 0);
	assertThat(dt1.toString(), is("2000-01-01T00:00:00.000+09:00"));
	DateTime dt2 = new DateTime(2000, 1, 1, 0, 0, 0);
	assertThat(dt2.toString(), is("2000-01-01T00:00:00.000+09:00"));
	DateTime dt3 = dt1.minusDays(10);
	assertThat(dt3.toString(), is("1999-12-22T00:00:00.000+09:00"));
	DateTime dt4 = dt1.plusDays(10);
	assertThat(dt4.toString(), is("2000-11-01T00:00:00.000+09:00"));

	// dt1("2000-01-01T00:00:00.000+09:00")とdt2("2000-01-01T00:00:00.000+09:00")は同じである。
	assertTrue(dt1.isEqual(dt2));
	// dt1("2000-01-01T00:00:00.000+09:00")はdt3("1999-12-22T00:00:00.000+09:00")の後である。
	assertTrue(dt1.isAfter(dt3));
	// dt1("2000-01-01T00:00:00.000+09:00")とdt4("2000-11-01T00:00:00.000+09:00")の前である。
	assertTrue(dt1.isBefore(dt4));

まとめ

今回ご紹介した、DateTime classはJodaTimeの中で一番使われるClassです。
次回はDateTime以外のClassをご紹介とJodaTimeを応用したサンプルをご紹介します。

【関連記事】
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 =応用編=

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