Java - JodaTime 日付関連が凄く簡単

```java:
package test;

import java.util.ArrayList;
import java.util.List;

import org.joda.time.DateMidnight;
import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.junit.Test;

public class JodaTimeSample {

        @Test
        public void sample1() {

                // 現在日時
                DateTime datetime = new DateTime();
                System.out.println("現在の日時: " + datetime);
                System.out.println("年: " + datetime.getYear());
                System.out.println("月: " + datetime.getMonthOfYear());
                System.out.println("日: " + datetime.getDayOfMonth());
                System.out.println("曜日: " + datetime.getDayOfWeek());
                System.out.println("時: " + datetime.getHourOfDay());
                System.out.println("分: " + datetime.getMinuteOfHour());
                System.out.println("秒: " + datetime.getSecondOfMinute());

                // 2005年の今日
                System.out.println("2005年の今日: " + datetime.withYear(2005));

                // 一ヶ月後
                System.out.println("1ヶ月後: " + datetime.plusMonths(1));

                // 文字列フォーマットと日付型変換
                DateTime dt1 = new DateTime("2011-04-05T13:20:25");
                System.out.println(dt1.toString("yyyy年MM月dd日"));
                System.out.println(dt1.toDate());

                DateTime dt2 = new DateTime("2011-04-05");
                System.out.println(dt2.toString("yyyy年MM月dd日"));
                System.out.println(dt2.toDate());

                // これはダメ
                DateTime dt3 = new DateTime("20110405");
                System.out.println(dt3.toString("yyyy年MM月dd日"));
                System.out.println(dt3.toDate());

        }

        @Test
        public void sample2() {

                DateMidnight dm1 = new DateMidnight(2011, 6, 17);
                DateTime dm2 = new DateTime(2011, 6, 19, 23, 59, 59, 0);

                // 日付範囲を持つオブジェクト
                Interval interval = new Interval(dm1, dm2);

                System.out.println(interval.getStart());
                System.out.println(interval.getEnd());
        }

        @Test
        public void sample3() {

                // 日曜日始まりの週表示のカレンダー
                int y = 2011;
                int m = 6;

                // 月の初日の前週の日曜日を取得
                DateMidnight str = new DateMidnight(y, m, 1).withDayOfWeek(1).minusDays(1);
                // 月の末日の週の土曜日を取得
                DateMidnight end = new DateMidnight(y, m, 1).dayOfMonth().withMaximumValue().withDayOfWeek(7);

                // ネスト構造のリストにする
                List<List<String>> month = new ArrayList<List<String>>();
                List<String> week = new ArrayList<String>();
                while (!str.equals(end)) {
                        week.add(String.format("%02d", str.getDayOfMonth()));
                        str = str.plusDays(1);
                        if (str.getDayOfWeek() == 7) {
                                month.add(week);
                                week = new ArrayList<String>();
                        }
                }

                // 表示
                System.out.println(String.format(" %s年%s月", y, m));
                System.out.println(" 日 月 火 水 木 金 土");
                for (List<String> w : month) {
                        for (String d : w) {
                                System.out.print(" " + d);
                        }
                        System.out.println("");
                }
        }

        @Test
        public void sample4() {

                // 日付の範囲を取得
                DateTime str = new DateTime(2011, 1, 1, 12, 0, 0, 0);
                DateTime end = new DateTime(2011, 1, 2, 13, 30, 0, 0);
                Interval interval = new Interval(str, end);
                Period period = interval.toPeriod();
                System.out.println(period.getDays());
                System.out.println(period.getHours());
                System.out.println(period.getMinutes());
        }

        @Test
        public void sample5() {
                DateTime str1 = new DateTime(0, 1, 1, 0, 0, 0, 0);
                DateTime end1 = new DateTime(2011, 6, 1, 23, 59, 59, 0);
                DateTime str2 = new DateTime(2011, 6, 2, 0, 0, 0, 0);
                DateTime end2 = new DateTime(2011, 6, 3, 23, 59, 59, 0);
                DateTime str3 = new DateTime(2011, 6, 4, 0, 0, 0, 0);
                DateTime end3 = new DateTime(9999, 1, 1, 0, 0, 0, 0);
                Interval interval1 = new Interval(str1, end1);
                Interval interval2 = new Interval(str2, end2);
                Interval interval3 = new Interval(str3, end3);

                interval1.withEnd(end2);
                List<Interval> list = new ArrayList<Interval>();
                list.add(interval1);
                list.add(interval2);
                list.add(interval3);

                // 開始日・終了日を一日プラスしてみる
                List<Interval> list2 = new ArrayList<Interval>();
                for(Interval i : list){
                        list2.add(i.withEnd(i.getEnd().plusDays(1)).withStart(i.getStart().plusDays(1)));
                }

                for (Interval i : list2) {
                        if(i.getStart().getYear() == 0){
                                System.out.println(i.getEnd().toString("yyyy/MM/dd"));
                        }else if(i.getEnd().getYear() == 9999){
                                System.out.println(i.getStart().toString("yyyy/MM/dd"));
                        }else if(i.getStart().toString("yyyy/MM/dd").equals(i.getEnd().toString("yyyy/MM/dd"))){
                                System.out.println(i.getStart().toString("yyyyMMdd"));
                        }else{
                                System.out.println(i.getStart().toString("yyyy/MM/dd") + "～" + i.getEnd().toString("yyyy/MM/dd"));
                        }
                }
        }
}
```