Javaで日付を扱うときDateやCalendarを使います。
これらのクラスを使うとき、結構手順を踏まないと目的の日付を取得出来ません。
コードも長くなってメンテナンスもしにくくなります。
そんな問題を解決したのが、日付に特化した「Joda-Time」ライブラリです。
よく使うもので大きく分けると「日付」と「期間」という2つの括りになります。
内容が長くなるのでこの2つで分けて記事にしました。
日本語のドキュメントがあまりなかったので、時間をかけてまとめてみました。
まとめてみて感じたのが、結構簡単に日付を扱えるということ、作成した日付に対して連続で違う処理を行えることがかなりいいと感じました。
ただ、柔軟すぎてどのメソッドを使ったらいいか迷いますので、ここでは簡潔に書けて必要なものだけ上げました。
目次
必要なライブラリ
joda-time-xxx.jar
今回はバージョン2.2でまとめています。
Jodaの日付クラス
クラス名 | 機能 |
---|---|
DateTime | JavaのCalendarにあたるクラス |
DateTimeMidnight | DateTimeの時間を00:00:00.000に固定したクラス |
LocalDate | ロケールを含まず、日付のみを扱うクラス |
LoclTime | ロケールを含まず、時間のみ扱うクラス |
LocalDateTime | ロケールを含まず、日付と時間を扱うクラス |
使い方
DateTimeの初期化
// 引数なし DateTime dt = new DateTime(); // Date型から DateTime dt = new DateTime(new Date()); // Calendar型から DateTime dt = new DateTime(Calendar.getInstance()); // ISO日付文字列から DateTime dt = new DateTime("2013-08-01"); DateTime dt = new DateTime("2013-08-01T12:30:50") // 年月日時分 DateTime dt = new DateTime(2013, 8, 1, 12, 30); // 年月日時分秒 DateTime dt = new DateTime(2013, 8, 1, 12, 30, 50); // ミリ秒から Date d = new Date(); DateTime dt = new DateTime(d.getTime());
DateTimeからの変換
DateTime dt = new DateTime(); // Calendarに変換 dt.toCalendar(); // Dateに変換 dt.toDate(); // DateMidnightに変換 dt.toDateMidnight(); // LocalDateに変換 dt.toLocalDate(); // LocalDateTimeに変換 dt.toLocalDateTime(); // LocalTimeに変換 dt.toLocalTime();
日付の取得
Calendarクラスのgetに相当する。 // 現在日付取得// 2013-08-01T12:30:50.666+09:00 DateTime dt = new DateTime(); // 年 => 2013 dt.getYear(); // 月 => 8 dt.getMonthOfYear(); // 日 => 1 dt.getDayOfMonth(); // 曜日(月曜日=1、日曜日=7)=> 4 dt.getDayOfWeek(); // 時 => 12 dt.getHourOfDay(); // 分 => 30 dt.getMinuteOfHour(); // 秒 => 50 dt.getSecondOfMinute(); // ミリ秒 => 666 dt.getMillisOfSecond(); // 1970/1/1からのミリ秒 => 1375327850666 dt.getMillis(); // 月末 => 31(8月の末日) dt.dayOfMonth().getMaximumValue(); // 通年日 => 213 dt.getDayOfYear(); // 通年週 => 31 dt.getWeekOfWeekyear();
日付の再設定
Calendarクラスのsetメソッドに相当する。
DateTime dt = new DateTime(); // 日付 dt.withDate(2013, 10, 20); // 時刻 dt.withTime(12, 30, 50, 333); // 年 dt.withYear(2012); // 月 dt.withMonthOfYear(5); // 日 dt.withDayOfMonth(10); // 曜日(月曜日=1、日曜日=7) dt.withDayOfWeek(3); // 時 dt.withHourOfDay(12); // 分 dt.withMinuteOfHour(30); // 秒 dt.withSecondOfMinute(50); // ミリ秒 dt.withMillisOfSecond(321); // 1970/1/1からのミリ秒 dt.withMillis(1324543605407); // 通年日 dt.withDayOfYear(34); // 通年週 dt.withWeekOfWeekYear(10);
日付のフォーマット
// 2013-08-01T12:30:50.666+09:00 DateTime dt = new DateTime(); // --- 文字列// 全て => 2013-08-01T12:30:50.666+09:00 dt.toString(); // 年のみ => 2013 dt.toString("yyyy"); // 月のみ => 08 dt.toString("MM"); // 日のみ => 01 dt.toString("dd"); // 時のみ => 12 dt.toString("HH"); // 分のみ => 30 dt.toString("mm"); // 秒のみ => 50 dt.toString("ss"); // ミリ秒のみ => 666 dt.toString("SSS"); // --- 年月日、時分秒フォーマット// => 2013年8月1日 dt.toString(DateTimeFormat.fullDate()); // => 2013年8月1日 12時30分50秒 JST dt.toString(DateTimeFormat.fullDateTime()); // => 12時30分50秒 JST dt.toString(DateTimeFormat.fullTime()); // --- 「/」「:」フォーマット// => 2013/08/01 dt.toString(DateTimeFormat.longDate()); // => 2013/08/01 12:30:50 JST dt.toString(DateTimeFormat.longDateTime()); // => 12:30:50 JST dt.toString(DateTimeFormat.longTime()); // --- JSTを省略// => 2013/08/01 dt.toString(DateTimeFormat.mediumDate()); // => 2013/08/01 12:30:50 dt.toString(DateTimeFormat.mediumDateTime()); // => 12:30:50 dt.toString(DateTimeFormat.mediumTime()); // --- 年を2桁または秒を省略// => 13/08/01 dt.toString(DateTimeFormat.shortDate()); // => 13/08/01 12:30 dt.toString(DateTimeFormat.shortDateTime()); // => 12:30 dt.toString(DateTimeFormat.shortTime());
日付文字列の変換
// --- 文字列からDateTime型へ変換// yyyy/MM/dd DateTimeFormat.forPattern("yyyy/MM/dd").parseDateTime("2013/08/01"); // スラッシュなし DateTimeFormat.forPattern("yyyyMMdd").parseDateTime("20130801"); // 日時スラッシュなし(CSVなどの文字列でよくあるパターン) DateTimeFormat.forPattern("yyyyMMddHHmmss").parseDateTime("20130801102030"); // --- 文字列からLocalDate型へ変換 DateTimeFormat.forPattern("yyyy/MM/dd").parseLocalDate("2013/08/01"); // --- 文字列からLocalDateTime型へ変換 DateTimeFormat.forPattern("yyyy/MM/dd").parseLocalDateTime("2013/08/01"); // --- 文字列からLocalTime型へ変換 DateTimeFormat.forPattern("HH:mm:ss").parseLocalTime("2013/08/01"); // --- 文字列からDateTime型に変換し、Date型にする DateTimeFormat.forPattern("yyyy/MM/dd").parseDateTime("2013/08/01").toDate(); // --- 文字列からDateTime型に変換し、Calendar型にする DateTimeFormat.forPattern("yyyy/MM/dd").parseDateTime("2013/08/01").toCalendar(Locale.JAPANESE);
日付の比較
// 2013-01-01 00:00:00 DateTime dt1 = new DateTime(2013, 1, 1); // 2013-02-01 00:00:00 DateTime dt2 = new DateTime(2013, 2, 1); // --- 2つのDateTime日時との比較// dt1はdt2より未来か? => false dt1.isAfter(dt2); // dt1はdt2より過去か? => true dt1.isBefore(dt2); // dt1とdt2は等しいか? => false dt1.isEqual(dt2); // --- 現在日時との比較// 現在 => 2013-03-01 00:00:00のとき// dt1は現在日時より未来か? => false dt1.isAfterNow(); // dt1は現在日時より過去か? => true dt1.isBeforeNow(); // dt1と現在日時は等しいか? => false dt1.isEqualNow();
日付の加算
// // 2013-08-01T12:30:50.666+09:00 DateTime dt = new DateTime(); // 月加算 => 2013-10-01T12:30:50.666+09:00 dt.plusMonths(2); // 日加算 => 2013-08-11T12:30:50.666+09:00 dt.plusDays(10); // 時加算 => 2013-08-01T16:30:50.666+09:00 dt.plusHours(4); // 分加算 => 2013-08-01T12:50:50.666+09:00 dt.plusMinutes(20); // 秒加算 => 2013-08-01T12:31:20.666+09:00 dt.plusSeconds(30); // ミリ秒加算 => 2013-08-01T12:30:51.166+09:00 dt.plusMillis(500);
日付の減算
DateTime dt = new DateTime(); // 月減算 => 2013-06-01T12:30:50.666+09:00 dt.minusMonths(2); // 日減算 => 2013-07-22T12:30:50.666+09:00 dt.minusDays(10); // 時減算 => 2013-08-01T08:30:50.666+09:00 dt.minusHours(4); // 分減算 => 2013-08-01T12:10:50.666+09:00 dt.minusMinutes(20); // 秒減算 => 2013-08-01T12:30:20.666+09:00 dt.minusSeconds(30); // ミリ秒減算 => 2013-08-01T12:30:50.166+09:00 dt.minusMillis(500);
システム日付
// 現在日時を取得する DateTimeUtils.currentTimeMillis() // 現在日時を指定のミリ秒で強制的に変更する DateTimeUtils.setCurrentMillisFixed(millis); // 現在日時を現在の時刻からのミリ秒オフセットで強制的に変更する DateTimeUtils.setCurrentMillisOffset(millis); // 強制変更した現在日時をリセットする DateTimeUtils.setCurrentMillisSystem();
定数
DateTimeConstantsが定数クラス。
// --- 曜日// 月曜(1) DateTimeConstants.MONDAY // 火曜(2) DateTimeConstants.TUESDAY // 水曜(3) DateTimeConstants.WEDNESDAY // 木曜(4) DateTimeConstants.THURSDAY // 金曜(5) DateTimeConstants.FRIDAY // 土曜(6) DateTimeConstants.SATURDAY // 日曜(7) DateTimeConstants.SUNDAY // --- 月// 1月 DateTimeConstants.MONDAY // 2月 DateTimeConstants.TUESDAY // 3月 DateTimeConstants.WEDNESDAY // 4月 DateTimeConstants.APRIL // 5月 DateTimeConstants.FRIDAY // 6月 DateTimeConstants.SATURDAY // 7月 DateTimeConstants.SUNDAY // 8月 DateTimeConstants.AUGUST // 9月 DateTimeConstants.SEPTEMBER // 10月 DateTimeConstants.OCTOBER // 11月 DateTimeConstants.NOVEMBER // 12月 DateTimeConstants.DECEMBER