2000年3月29日星期三

Javaの日付操作

Javaの日付操作


package test;

import java.text.DateFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

public class F30Date {
    /**
     * 2つの日付の月数の差を求めます。 
     *Date 型の日付 date1-date2 が何ヵ月かを整数で返します。※端数の日数は無視
     * 
     * @param date1 日付1 java.util.Date
     * @param date2 日付2 java.util.Date
     * 
     * @return 2つの日付の月数の差
     */
    public static int differenceMonths(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();

        cal1.setTime(date1);
        cal1.set(Calendar.DATE, 1);

        Calendar cal2 = Calendar.getInstance();

        cal2.setTime(date2);
        cal2.set(Calendar.DATE, 1);

        int count = 0;

        if (cal1.before(cal2)) {
            while (cal1.before(cal2)) {
                cal1.add(Calendar.MONTH, 1);
                count--;
            }
        } else {
            count--;
            while (!cal1.before(cal2)) {
                cal1.add(Calendar.MONTH, -1);
                count++;
            }
        }

        return count;
    }

    /**
     * 2つの日付の月数の差を求めます。
     *日付文字列 strDate1-strDate2 が何ヵ月かを整数で返します。※端数の日数は無視
     * 
     * @param strDate1 日付文字列1 【YYYY/MM/DD】OR【YYYY/MM/DD hh:mm:ss】
     * @param strDate2 日付文字列2 【YYYY/MM/DD】OR【YYYY/MM/DD hh:mm:ss】
     * 
     * @return 2つの日付の月数の差
     * 
     * @throws ParseException 日付フォーマットが不正な場合
     */
    public static int differenceMonths(String strDate1, String strDate2) 
        throws ParseException {
        Date date1 = DateFormat.getDateInstance().parse(strDate1);
        Date date2 = DateFormat.getDateInstance().parse(strDate2);

        return differenceMonths(date1, date2);
    }

    /**
     * 2つの日付の月数の差を求めます。
     *Calendar 型の日付 cal1-cal2 が何ヵ月かを整数で返します。※端数の日数は無視
     * 
     * @param date1 日付1 java.util.Calendar
     * @param date2 日付2 java.util.Calendar
     * 
     * @return 2つの日付の月数の差
     */
    public static long differenceMonths(Calendar cal1, Calendar cal2) {
        Date t1 = cal1.getTime();
        Date t2 = cal2.getTime();

        return differenceMonths(t1, t2);
    }

    /**
     * 2つの日付の日数の差を求めます。Date 型の日付 date1-date2 が何日かを整数で返します。
     * 
     * @param date1 日付1 java.util.Date
     * @param date2 日付2 java.util.Date
     * 
     * @return 2つの日付の日数の差
     */
    public static long differenceDays(Date t1, Date t2) {
        // 日付の差を求める
        long diff = t1.getTime() - t2.getTime();

        // 日付の差はミリ秒になっているので、日数に計算して表示する
        return (diff / 1000 / 60 / 60 / 24);
    }

    /**
     * 2つの日付の日数の差を求めます。日付文字列 strDate1-strDate2 が何日かを整数で返します。
     * 
     * @param strDate1 日付文字列1 【YYYY/MM/DD】OR【YYYY/MM/DD hh:mm:ss】
     * @param strDate2 日付文字列2 【YYYY/MM/DD】OR【YYYY/MM/DD hh:mm:ss】
     * 
     * @return 2つの日付の日数の差
     * 
     * @throws ParseException 日付フォーマットが不正な場合
     */
    public static long differenceDays(String strDate1, String strDate2) 
        throws ParseException {
        Date date1 = DateFormat.getDateInstance().parse(strDate1);
        Date date2 = DateFormat.getDateInstance().parse(strDate2);

        return differenceDays(date1, date2);
    }

    /**
     * 2つの日付の日数の差を求めます。Date 型の日付 date1-date2 が何日かを整数で返します。
     * 
     * @param cal1 日付1 java.util.Calendar
     * @param cal2 日付2 java.util.Calendar
     * 
     * @return 2つの日付の日数の差
     */
    public static long differenceDays(Calendar cal1, Calendar cal2) {
        Date t1 = cal1.getTime();
        Date t2 = cal2.getTime();

        return differenceDays(t1, t2);
    }
    
    /**
     * 日付の妥当性チェック。
     * 
     * @param year   年
     * @param month  月
     * @param day    日
     * 
     * @return 引数は正しい日付の場合true、なければfalse
     */
    public static boolean isDate(int year, int month, int day) {
        boolean flg = true;
        
        Calendar cal1 = Calendar.getInstance();
        
        // 日付・時刻解析を厳密に行うかどうかを設定する
        cal1.setLenient(false); 
        cal1.set(year, month - 1, day);

        try {
            cal1.getTime();
        } catch (IllegalArgumentException e) {
            flg = false;
        }
        return flg;
    }
    
    /**
     * 日付の妥当性チェック(hh:mm:ssのチェックを含まず)
     * 
     * @param dateStr 日付
     * 
     * @return 引数は正しい日付の場合true、なければfalse
     */
    public static boolean isDate(String dateStr) {
        boolean flg = true;

        DateFormat format = DateFormat.getDateInstance();

        // 日付・時刻解析を厳密に行うかどうかを設定する
        format.setLenient(false);

        try {
            format.parse(dateStr);
        } catch (Exception e) {
            flg = false;
        }

        return flg;
    }
    
    /**
     * 現在の日付・時刻から指定の時間量を加算・減算した結果を返します。
     * 年、月、日、時間、分、秒、ミリ秒の各時間フィールドに対し、任意の時間量を設定できます。
     * たとえば、現在の日付時刻から 10 日前を計算する場合は以下となります。
     * Calendar cal = add(null,0,0,-10,0,0,0,0);
     * 
     * 各時間フィールドの値がその範囲を超えた場合、次の大きい時間フィールドが増分または減分されます。
     * たとえば、以下では1時間と5分進めることになります。
     * Calendar cal = add(null,0,0,0,0,65,0,0);
     * 
     * @param cal 日付時刻の指定があればセットする。NULLの場合現在の日付で新しいCalendarを生成する。
     * @param addYera        加算・減算する年数
     * @param addMonth       加算・減算する月数
     * @param addDate        加算・減算する日数
     * @param addHour        加算・減算する時間
     * @param addMinute      加算・減算する分
     * @param addSecond      加算・減算する秒
     * @param addMillisecond 加算・減算するミリ秒
     * 
     * @return    計算後の Calendar インスタンス。
     */
    public static Calendar add(Calendar cal,
                               int addYera,int addMonth,int addDate,
                               int addHour,int addMinute,int addSecond,
                               int addMillisecond){
        if (cal == null) {
            cal = Calendar.getInstance();
        }
        
        cal.add(Calendar.YEAR, addYera);
        cal.add(Calendar.MONTH, addMonth);
        cal.add(Calendar.DATE, addDate);
        cal.add(Calendar.HOUR_OF_DAY, addHour);
        cal.add(Calendar.MINUTE, addMinute);
        cal.add(Calendar.SECOND, addSecond);
        cal.add(Calendar.MILLISECOND, addMillisecond);
        
        return cal;
    }
    
    public static void main(String[] args) {
        // インスタンス取得
        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();

        // 時間フィールドクリア
        c1.clear();
        c2.clear();

        // 比較する日付をセット
        c2.set(2010, Calendar.MAY, 1);
        c1.set(2010, Calendar.NOVEMBER, 30);

        System.out.println(isDate("2010/1/3"));
    }
    
    public static String getDateString(Calendar cal1) {
        int year = cal1.get(Calendar.YEAR);           // (2)現在の年を取得
        int month = cal1.get(Calendar.MONTH) + 1;     // (3)現在の月を取得
        int day = cal1.get(Calendar.DATE);            // (4)現在の日を取得
        int hour = cal1.get(Calendar.HOUR_OF_DAY);    // (5)現在の時を取得
        int minute = cal1.get(Calendar.MINUTE);       // (6)現在の分を取得
        int second = cal1.get(Calendar.SECOND);       // (7)現在の秒を取得

        String dateStr = year+"/"+month+"/"+day+" "+hour+":"+minute+":"+second;
        return dateStr;
    }
}

没有评论:

发表评论