Java で日付の挙動を確認する

サンプルコード

import java.util.*;
import java.text.*;
import java.util.regex.*;

public class DateSample {
    public static void main(String[] args) throws ParseException {
        // Calendar クラスは new をしてインスタンスは得られない
        Calendar cal = Calendar.getInstance();

        int year       = cal.get(cal.YEAR);
        int month      = cal.get(cal.MONTH) + 1;
        int date       = cal.get(cal.DATE);
        int dayOfWeek  = cal.get(cal.DAY_OF_WEEK) - 1;
        int ampm       = cal.get(cal.AM_PM);
        int hour       = cal.get(cal.HOUR);
        int minute     = cal.get(cal.MINUTE);
        int second     = cal.get(cal.SECOND);
        String[] days  = {"日", "月", "火", "水", "木", "金", "土"};
        String[] ampms = {"午前", "午後"};

        System.out.println(year + "年" + month + "月" + date + "日(" + days[dayOfWeek] + ")");
        System.out.println(ampms[ampm] + hour + "時" + minute + "分" + second + "秒");

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
        System.out.println("ISO 8601形式で出力をする");
        System.out.println(sdf.format(cal.getTime()));

        cal.add(Calendar.DATE, -3);
        System.out.println("月をまたいだ数日前の出力結果");
        System.out.println(sdf.format(cal.getTime()));

        cal.add(Calendar.DATE, 6);
        System.out.println("日付加減をした後に、さらに加減した場合の出力結果");
        System.out.println(sdf.format(cal.getTime()));

        cal.clear();
        System.out.println("Calendar クラスの clear メソッドを実行した後の出力結果");
        System.out.println(sdf.format(cal.getTime()));

        // SimpleDateFormat の日付形式を変更する
        //sdf.applyPattern("yyyy-MM-dd HH:mm:ss");

        // 文字列を「日時」に変換する(この場合、時間も必須)
        // 日付の場合は下部の例を参照
        String sampleDate = "2010/03/03 15:05:12";

        // Date クラスを使った変換
        Date dateFromString;
        try {
           dateFromString = DateFormat.getDateInstance().parse(sampleDate);
           System.out.println("文字列をDateクラスに変換して形式を整えて出力");
           System.out.println(sdf.format(dateFromString));
        } catch (ParseException e) {
            throw e;
        }

        // 正規表現で日時の文字列を分解して日時を表示する
        Pattern regexDate = Pattern.compile("^(\\d{1,4})/([0-1]\\d)/([0-3]\\d) ([0-2]\\d):([0-5]\\d):([0-5]\\d)");
        Matcher dateParts = regexDate.matcher(sampleDate);

        if (dateParts.find()) {
            // 日時を単純に文字列として表示する
            String sYear   = dateParts.group(1);
            String sMonth  = dateParts.group(2);
            String sDate   = dateParts.group(3);
            String sHour   = dateParts.group(4);
            String sMinute = dateParts.group(5);
            String sSecond = dateParts.group(6);

            System.out.println("正規表現から取得した日時を文字列として出力");
            System.out.println(sYear + "-" + sMonth + "-" + sDate + " " + sHour + ":" + sMinute + ":" + sSecond);

            // 文字列の日時を操作して、出力したい場合は Caledar クラスを利用する
            int iYear   = Integer.parseInt(sYear);
            int iMonth  = Integer.parseInt(sMonth);
            int iDate   = Integer.parseInt(sDate);
            int iHour   = Integer.parseInt(sHour);
            int iMinute = Integer.parseInt(sMinute);
            int iSecond = Integer.parseInt(sSecond);

            Calendar strToCalendar = Calendar.getInstance();
            strToCalendar.set(iYear, iMonth, iDate, iHour, iMinute, iSecond);
            // 内容を確認しやすいように日時を変更する
            strToCalendar.add(Calendar.YEAR, 1);
            System.out.println("正規表現から取得した日付をCalendarクラスに変換して、1年後の日時を出力");
            System.out.println(sdf.format(strToCalendar.getTime()));
        } else {
            System.out.println("指定した日時形式ではありません。");
        }

        /* ふたつの日付から日数(期間)を求める
         * 文字列の日付を Calendar オブジェクトに変換し、computeTime で
         * ミリ秒の差分を求めてから日数を求めることもできるが、
         * Date オブジェクトで日数を求めるほうが楽。
        */
        String beforeDate = "2010-02-14";
        String afterDate  = "2010-03-13";

        try {
            SimpleDateFormat diff = new SimpleDateFormat("yyyy-MM-dd");
            Date febrary = diff.parse(beforeDate);
            Date march   = diff.parse(afterDate);
            // ミリ秒で時間差を求める
            long difference = march.getTime() - febrary.getTime();
            // 24時間 * 60分 * 60秒 * 1000ミリ秒
            difference = difference / (24 * 60 * 60 * 1000);
            System.out.println("2010年2月14日から2010年3月13日までの日数を表す");
            System.out.println("日数は " + difference + " 日あります");

            System.out.println("日数分の日付を表示する");
            Calendar startDate = Calendar.getInstance();
            Calendar endDate = Calendar.getInstance();
            startDate.setTime(febrary);
            endDate.setTime(march);
            while (startDate.before(endDate)) {
                // 下記2行を前後させることで、出力される日付が変わることに注意
                System.out.println(diff.format(startDate.getTime()));
                startDate.add(Calendar.DATE, 1);
            }
        } catch (ParseException e) {
            throw e;
        }
    }
}

実行結果

201032日(火)
午後8036秒
ISO 8601形式で出力をする
2010-03-02T20:00:36+0900
月をまたいだ数日前の出力結果
2010-02-27T20:00:36+0900
日付加減をした後に、さらに加減した場合の出力結果
2010-03-05T20:00:36+0900
Calendar クラスの clear メソッドを実行した後の出力結果
1970-01-01T00:00:00+0900
文字列をDateクラスに変換して形式を整えて出力
2010-03-03T00:00:00+0900
正規表現から取得した日付を文字列として出力
2010-03-03 15:05:12
正規表現から取得した日付をCalendarクラスに変換して、1年後の日付を出力
2011-04-03T15:05:12+0900
Calendarクラスに変換して月末日を取得する
月末の日付は 30 です
2010214日から2010313日までの日数を表す
日数は 27 日あります
日数分の日付を表示する
2010-02-14
2010-02-15
2010-02-16
2010-02-17
2010-02-18
2010-02-19
2010-02-20
2010-02-21
2010-02-22
2010-02-23
2010-02-24
2010-02-25
2010-02-26
2010-02-27
2010-02-28
2010-03-01
2010-03-02
2010-03-03
2010-03-04
2010-03-05
2010-03-06
2010-03-07
2010-03-08
2010-03-09
2010-03-10
2010-03-11
2010-03-12