/*
 * MosP - Mind Open Source Project    http://www.mosp.jp/
 * Copyright (C) MIND Co., Ltd.       http://www.e-mind.co.jp/
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package jp.mosp.common.utils;

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

import jp.mosp.common.CommonConst;
import jp.mosp.common.common.MospUtility;

/**
 * 日付に関するPartクラス
 * @author yoshida
 * @version		0.0.6
 */
public class DateUtil {
	
	/**
	 * 
	 */
	private DateUtil() {
		// 他クラスによるインスタンス化を防止
	}
	
	/**
	 * 月差取得
	 * @param date1 終了月
	 * @param date2 開始月
	 * @return 月差(date1 - date2)
	 */
	public static int getMonthRemainder(Date date1, Date date2) {
		int year1 = MospUtility.getYear(date1);
		int month1 = MospUtility.getMonth(date1);
		int year2 = MospUtility.getYear(date2);
		int month2 = MospUtility.getMonth(date2);
		int remainder = year1 * 12 + month1 - year2 * 12 - month2;
		return remainder;
	}
	
	/**
	 * 日数取得
	 * @param date1 終了日
	 * @param date2 開始日
	 * @return 日数(date1 - date2)
	 */
	public static long getDateRemainder(Date date1, Date date2) {
		long remainder = date1.getTime() - date2.getTime();
		return (remainder / (1000 * 60 * 60 * 24)) + 1;
	}
	
	/**
	 * 年操作
	 * @param date   操作日付
	 * @param amount 増減月数
	 * @return 操作後日付
	 */
	public static Date addYear(Date date, int amount) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		cal.add(Calendar.YEAR, amount);
		return cal.getTime();
	}
	
	/**
	 * 月操作
	 * @param date   操作日付
	 * @param amount 増減月数
	 * @return 操作後日付
	 */
	public static Date addMonth(Date date, int amount) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		cal.add(Calendar.MONTH, amount);
		return cal.getTime();
	}
	
	/**
	 * 日操作
	 * @param date   操作日付
	 * @param amount 増減日数
	 * @return 操作後日付
	 */
	public static Date addDay(Date date, int amount) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		cal.add(Calendar.DAY_OF_MONTH, amount);
		return cal.getTime();
	}
	
	/**
	 * 日操作
	 * @param date   操作日付
	 * @param amount 増減日数
	 * @return 操作後日付
	 */
	public static Date addDay(Date date, String amount) {
		return addDay(date, Integer.parseInt(amount));
	}
	
	/**
	 * 日付取得（String）
	 * @return 日付初期値
	 */
	public static Date getInitialDate() {
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date(0));
		return cal.getTime();
	}
	
	/**
	 * システム日付取得
	 * @return システム日付
	 */
	public static Date getSystemDate() {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * システム日付取得
	 * @return システム日付
	 */
	public static Date getNowDate() {
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 月初日取得
	 * @param year  取得対象年
	 * @param month 取得対象月
	 * @return 月初日
	 */
	public static Date getFirstDateOfMonth(String year, String month) {
		return getFirstDateOfMonth(Integer.parseInt(year), Integer.parseInt(month));
	}
	
	/**
	 * 月初日取得
	 * @param year  取得対象年
	 * @param month 取得対象月
	 * @return 月初日
	 */
	public static Date getFirstDateOfMonth(int year, int month) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, month - 1);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 月初日取得
	 * @param date		対象年月日
	 * @return 月初日
	 */
	public static Date getFirstDateOfMonth(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 月最終日取得
	 * @param year  取得対象年
	 * @param month 取得対象月
	 * @return 月最終日
	 */
	public static Date getLastDateOfMonth(String year, String month) {
		return getLastDateOfMonth(Integer.parseInt(year), Integer.parseInt(month));
	}
	
	/**
	 * 月最終日取得
	 * @param year  取得対象年
	 * @param month 取得対象月
	 * @return 月最終日
	 */
	public static Date getLastDateOfMonth(int year, int month) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, month - 1);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		cal.add(Calendar.MONTH, 1);
		cal.add(Calendar.DAY_OF_MONTH, -1);
		return cal.getTime();
	}
	
	/**
	 * 月最終日取得
	 * @param date		対象年月日
	 * @return			月最終日
	 */
	public static Date getLastDateOfMonth(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		cal.add(Calendar.MONTH, 1);
		cal.add(Calendar.DAY_OF_MONTH, -1);
		return cal.getTime();
	}
	
	/**
	 * 年初日取得
	 * @param year  取得対象年
	 * @return 月初日
	 */
	public static Date getFirstDateOfYear(int year) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year);
		cal.set(Calendar.MONTH, 0);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 年初日取得
	 * @param year  取得対象年
	 * @return 月初日
	 */
	public static Date getFirstDateOfYear(String year) {
		return getFirstDateOfYear(Integer.parseInt(year));
	}
	
	/**
	 * 年初日取得
	 * @param year  取得対象年
	 * @return 月最終日
	 */
	public static Date getLastDateOfYear(int year) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, year + 1);
		cal.set(Calendar.MONTH, 0);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		cal.add(Calendar.DAY_OF_MONTH, -1);
		return cal.getTime();
	}
	
	/**
	 * 年初日取得
	 * @param year  取得対象年
	 * @return 月最終日
	 */
	public static Date getLastDateOfYear(String year) {
		return getLastDateOfYear(Integer.parseInt(year));
	}
	
	/**
	 * 月初日取得
	 * @param date		対象年月日
	 * @return 月初日
	 */
	public static Date getFirstDateOfYear(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.MONTH, 0);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 月最終日取得
	 * @param date		対象年月日
	 * @return			月最終日
	 */
	public static Date getLastDateOfYear(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.MONTH, 0);
		cal.set(Calendar.DAY_OF_MONTH, 1);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		cal.roll(Calendar.YEAR, 1);
		cal.add(Calendar.DAY_OF_MONTH, -1);
		return cal.getTime();
	}
	
	/**
	 * 年月取得
	 * @param year  年
	 * @param month 月
	 * @return 年月
	 */
	public static Date getYearMonth(String year, String month) {
		return getYearMonth(Integer.parseInt(year), Integer.parseInt(month));
	}
	
	/**
	 * 年月取得
	 * @param year  年
	 * @param month 月
	 * @return 年月
	 */
	public static Date getYearMonth(int year, int month) {
		Calendar cal = Calendar.getInstance();
		cal.set(year, month - 1, 1, 0, 0, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 時間取得
	 * @param time 時間
	 * @return 日付
	 */
	public static Date getTimeAsDate(String time) {
		Date date = null;
		try {
			date = DateFormat.getTimeInstance(DateFormat.SHORT).parse(time);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		if (date != null) {
			Calendar cal = Calendar.getInstance();
			cal.setTime(date);
			cal.set(Calendar.YEAR, CommonConst.TIME_DEFAULT_YEAR);
			cal.set(Calendar.MONTH, CommonConst.TIME_DEFAULT_MONTH);
			cal.set(Calendar.DAY_OF_MONTH, CommonConst.TIME_DEFAULT_DAY);
			cal.set(Calendar.SECOND, 0);
			cal.set(Calendar.MILLISECOND, 0);
			return cal.getTime();
		}
		return null;
	}
	
	/**
	 * 選択日を含む一週間の開始日取得
	 * @param date			選択日
	 * @param dayofweek		開始曜日（{@link Calendar}の曜日のvalue）
	 * @return 選択日を含む一週間の開始日
	 */
	public static Date getFirstDateOfWeek(Date date, int dayofweek) {
		Calendar cal = Calendar.getInstance();
		cal.setFirstDayOfWeek(dayofweek);
		cal.setTime(date);
		cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
		return cal.getTime();
	}
	
	/**
	 * 選択日を含む一週間の終了日取得
	 * @param date			選択日
	 * @param dayofweek		開始曜日（{@link Calendar}の曜日のvalue）
	 * @return 選択日を含む一週間の終了日
	 */
	public static Date getLastDateOfWeek(Date date, int dayofweek) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(getFirstDateOfWeek(date, dayofweek));
		cal.add(Calendar.DATE, 6);
		return cal.getTime();
	}
	
	/**
	 * 日付変換(int→String[])
	 * @param date 対象日付
	 * @return 日付配列
	 */
	public static String[] convIntegerDateToArray(int date) {
		String[] arDate = new String[3];
		final int initDate = 19000101;
		if (date > initDate) {
			String strDate = String.valueOf(date);
			arDate[0] = strDate.substring(0, 4);
			arDate[1] = StringUtil.removeZero(strDate.substring(4, 6));
			arDate[2] = StringUtil.removeZero(strDate.substring(6, 8));
		} else {
			arDate[0] = "1900";
			arDate[1] = "01";
			arDate[2] = "01";
		}
		return arDate;
	}
	
	/**
	 * 日付変換(int→String)
	 * @param date 対象日付(yyyyMMdd)
	 * @return yyyy年MM月dd日
	 */
	public static String convIntegerDateToJPDate(int date) {
		return convDateToFormatDateJP(convIntegerDateToDate(date));
	}
	
	/**
	 * 日付変換(int→String)
	 * @param date 対象日付(yyyyMMdd)
	 * @return yyyy/MM/dd
	 */
	public static String convIntegerDateToStringFormatted(int date) {
		return convDateFormatted(convIntegerDateToDate(date));
	}
	
	/**
	 * 日付変換(String→int)
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @return yyyyMMdd
	 */
	public static int convStringDateToInteger(String year, String month, String day) {
		return NumberUtil.getIntParam(convDateToString(getDate(year, month, day)));
	}
	
	/**
	 * 日付変換(String→int)
	 * @param 	yyyymmdd yyyy-MM-dd
	 * @return yyyyMMdd
	 */
	public static int convStringDateToInteger(String yyyymmdd) {
		return NumberUtil.getIntParam(convDateToString(convHyphenDateToDate(yyyymmdd)));
	}
	
	/**
	 * 日付変換(int→String)
	 * @param year 	対象年
	 * @param month 	対象月
	 * @param day 	対象日
	 * @return	日付（yyyyMMdd）
	 */
	public static String convIntegerToStringDate(int year, int month, int day) {
		return convDateToString(getDate(year, month, day));
	}
	
	/**
	 * 日付変換(Date→int)
	 * @param date	対象年月日
	 * @return yyyyMMdd
	 */
	public static int convDateToInteger(Date date) {
		return NumberUtil.getIntParam(convDateToString(date));
	}
	
	/**
	 * 日付変換(Date→String)
	 * @param date	対象年月日
	 * @return yyyyMMdd
	 */
	public static String convDateToString(Date date) {
		return MospUtility.getDateString(date, CommonConst.FORMAT_DATE_BASE);
	}
	
	/**
	 * 日付変換(Date→String)
	 * @param date	対象年月日
	 * @return yyyy-MM
	 */
	public static String convDateToStringYearMonth(Date date) {
		return MospUtility.getDateString(date, CommonConst.FORMAT_YEAR_MONTH);
	}
	
	/**
	 * 日付変換(Date→String)
	 * @param date	対象年月日
	 * @return yyyy-M
	 */
	public static String convDateToStringYearMonthShort(Date date) {
		return MospUtility.getDateString(date, CommonConst.FORMAT_YEAR_MONTH_SHORT);
	}
	
	/**
	 * 日付変換(Date→String)
	 * @param date	対象年月日
	 * @return yyyy-MM-dd
	 */
	public static String convDateFormattedByHyphen(Date date) {
		return MospUtility.getDateString(date, CommonConst.FORMAT_DATE_HYPHEN);
	}
	
	/**
	 * 日付変換(Date→String)
	 * @param date	対象年月日
	 * @return yyyy/MM/dd
	 */
	public static String convDateFormatted(Date date) {
		return MospUtility.getDateString(date, CommonConst.FORMAT_DATE);
	}
	
	/**
	 * 日付変換(Date→String)
	 * @param date	対象年月日
	 * @return yyyy,MM,dd
	 */
	public static String convDateFormattedByComma(Date date) {
		return MospUtility.getDateString(date, CommonConst.FORMAT_DATE_COMMA);
	}
	
	/**
	 * 日付変換(Date→String)
	 * @param date	date
	 * @return yyyy年MM月dd日
	 */
	public static String convDateToFormatDateJP(Date date) {
		return MospUtility.getDateString(date, CommonConst.FORMAT_DATE_JP);
	}
	
	/**
	 * 日付変換(Date→String)
	 * @param date	date
	 * @return yyyy年M月d日
	 */
	public static String convDateToFormatDateJPShort(Date date) {
		return MospUtility.getDateString(date, CommonConst.FORMAT_DATE_JP_SHORT);
	}
	
	/**
	 * 日付変換(Date→String)
	 * @param date	対象年月日
	 * @return M/d
	 */
	public static String convDateToMonthDayShort(Date date) {
		return MospUtility.getDateString(date, CommonConst.FORMAT_MONTH_DAY_SHORT);
	}
	
	/**
	 * 日付変換(String→String)
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @return yyyy/MM/dd
	 */
	public static String convStringDateFormatted(String year, String month, String day) {
		return convDateFormatted(getDate(year, month, day));
	}
	
	/**
	 * 日付変換(String→String)
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @return yyyy,mm,dd
	 */
	public static String convStringDateFormattedByComma(String year, String month, String day) {
		return convDateFormattedByComma(getDate(year, month, day));
	}
	
	/**
	 * 日付変換(String→String)
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @return yyyy-MM-dd
	 */
	public static String convStringDateFormattedByHyphen(String year, String month, String day) {
		return convDateFormattedByHyphen(getDate(year, month, day));
	}
	
	/**
	 * 日付変換(int→String)
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @return yyyy-MM-dd
	 */
	public static String convDateFormattedByHyphen(int year, int month, int day) {
		return convDateFormattedByHyphen(getDate(year, month, day));
	}
	
	/**
	 * 日付変換（String→Date）
	 * @param yyyymmdd	yyyy/MM/dd
	 * @return date
	 */
	public static Date convStringDateToDate(String yyyymmdd) {
		return convFormatToDate(yyyymmdd, CommonConst.FORMAT_DATE);
	}
	
	/**
	 * 日付変換（String→Date）
	 * @param yyyymmdd yyyyMMdd
	 * @return date
	 */
	public static Date convStringBaseDateToDate(String yyyymmdd) {
		return convFormatToDate(yyyymmdd, CommonConst.FORMAT_DATE_BASE);
	}
	
	/**
	 * 日付変換(String→String[])
	 * @param yyyymmdd 対象日付(yyyy/mm/dd)
	 * @return 日付配列
	 */
	public static String[] convStringDateToArray(String yyyymmdd) {
		String[] arDate = new String[3];
		if (StringUtil.isNull(yyyymmdd)) {
			for (int i = 0; i < 3; i++) {
				arDate[i] = "";
			}
		} else {
			String[] aryDate = StringUtil.divideBySlash(yyyymmdd);
			arDate[0] = StringUtil.removeZero(aryDate[0]);
			arDate[1] = StringUtil.removeZero(aryDate[1]);
			arDate[2] = StringUtil.removeZero(aryDate[2]);
		}
		return arDate;
	}
	
	/**
	 * 日付変換（int→Date）
	 * @param yyyymmdd	yyyyMMdd
	 * @return date
	 */
	public static Date convIntegerDateToDate(int yyyymmdd) {
		return convFormatToDate(String.valueOf(yyyymmdd), CommonConst.FORMAT_DATE_BASE);
	}
	
	/**
	 * 日付変換(int→Date)
	 * @param year		対象年
	 * @param month		対象月
	 * @param day		対象日
	 * @return	Date	対象年月日
	 */
	public static Date getDate(int year, int month, int day) {
		Calendar cal = Calendar.getInstance();
		cal.set(year, month - 1, day);
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 日付変換(String→Date)
	 * @param year		対象年
	 * @param month		対象月
	 * @param day		対象日
	 * @return	Date	対象年月日
	 */
	public static Date getDate(String year, String month, String day) {
		return getDate(Integer.parseInt(year), Integer.parseInt(month), Integer.parseInt(day));
	}
	
	/**
	 * 日付変換（String→Date）
	 * @param yyyymmdd	yyyy-MM-dd
	 * @return date
	 */
	public static Date convHyphenDateToDate(String yyyymmdd) {
		return convFormatToDate(yyyymmdd, CommonConst.FORMAT_DATE_HYPHEN);
	}
	
	/**
	 * 日付変換（String→String）
	 * @param yyyymmdd	yyyy-MM-dd
	 * @return yyyy年M月d日
	 */
	public static String convHyphenDateToJPShortDate(String yyyymmdd) {
		return convDateToFormatDateJPShort(convHyphenDateToDate(yyyymmdd));
	}
	
	/**
	 * 日付変換（String→String）
	 * @param yyyymmdd	yyyy-MM-dd
	 * @return yyyy年MM月dd日
	 */
	public static String convHyphenDateToJPDate(String yyyymmdd) {
		return convDateToFormatDateJP(convHyphenDateToDate(yyyymmdd));
	}
	
	/**
	 * 日付変換（String→String）
	 * @param yyyymmdd	yyyy-MM-dd
	 * @return yyyy/MM/dd
	 */
	public static String convHyphenDateToFormatted(String yyyymmdd) {
		return convDateFormatted(convHyphenDateToDate(yyyymmdd));
	}
	
	/**
	 * 日付変換（String→String）
	 * @param yyyymmdd	yyyy/MM/dd
	 * @return yyyy-MM-dd
	 */
	public static String convFormattedToHyphen(String yyyymmdd) {
		return convDateFormattedByHyphen(convStringDateToDate(yyyymmdd));
	}
	
	/**
	 * 日付取得（String）
	 * @return	9999-99-99 00:00:00
	 */
	public static String getDateTime() {
		return MospUtility.getDateString(getSystemDate(), CommonConst.FORMAT_DATE_DETAILS);
	}
	
	/**
	 * 日付取得（String）
	 * @param date	対象年月日
	 * @return 9999-99-99 99:99:99
	 */
	public static String getDateTime(Date date) {
		return MospUtility.getDateString(date, CommonConst.FORMAT_DATE_DETAILS);
	}
	
	/**
	 * 期間中判断
	 * @param startDate		開始日
	 * @param endDate		終了日
	 * @param targetDate	対象日
	 * @return
	 * <p>
	 * 開始日と終了日の期間に対象日が存在する場合true、<br>
	 * そうでない場合false
	 * </p>
	 */
	public static boolean inPeriod(Date startDate, Date endDate, Date targetDate) {
		return targetDate.compareTo(startDate) >= 0 && targetDate.compareTo(endDate) <= 0;
	}
	
	/**
	 * 日付変換（String→Date）
	 * @since	0.0.2
	 * @param date		対象年月日
	 * @param format	日付フォーマット
	 * @return			Date型対象年月日
	 */
	public static Date convFormatToDate(String date, String format) {
		DateFormat df = new SimpleDateFormat(format);
		try {
			return df.parse(date);
		} catch (ParseException e) {
			//e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 対象年度開始日取得
	 * @since	0.0.3
	 * @param fiscalyear		対象年度
	 * @param startMonth		年度開始月
	 * @return	対象年度開始日
	 */
	public static Date getFiscalStartDate(int fiscalyear, int startMonth) {
		return getFirstDateOfMonth(fiscalyear, startMonth);
	}
	
	/**
	 * 対象年度終了年月日取得
	 * @since	0.0.3
	 * @param fiscalyear		対象年度
	 * @param startMonth		年度開始月
	 * @return	対象年度終了年月日
	 */
	public static Date getFiscalEndDate(int fiscalyear, int startMonth) {
		return getLastDateOfMonth(fiscalyear + 1, startMonth - 1);
	}
	
	/**
	 * 週操作
	 * @since	0.0.4
	 * @param targetDate	対象年月日
	 * @param amount		増減週数
	 * @return	操作後日付
	 */
	public static Date addWeek(Date targetDate, int amount) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(targetDate);
		cal.add(Calendar.WEEK_OF_MONTH, amount);
		return cal.getTime();
	}
	
	/**
	 * 時刻操作
	 * @since	0.0.4
	 * @param targetDate	対象年月日
	 * @param hour			対象時間
	 * @param min			対象分
	 * @return	操作後日付
	 */
	public static Date getTimeOfDate(Date targetDate, int hour, int min) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(targetDate);
		cal.set(Calendar.HOUR_OF_DAY, hour);
		cal.set(Calendar.MINUTE, min);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 曜日操作
	 * @since	0.0.4
	 * @param targetDate	対象年月日
	 * @param dayofweek		変更曜日（{@link Calendar}の曜日のvalue）
	 * @return	操作後日付
	 */
	public static Date getDayOfWeek(Date targetDate, int dayofweek) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(targetDate);
		cal.set(Calendar.DAY_OF_WEEK, dayofweek);
		return cal.getTime();
	}
	
	/**
	 * 時刻操作
	 * @since	0.0.5
	 * @param targetDate	対象年月日
	 * @param time	時刻（0時からの経過分数）
	 * @return	操作後日付
	 */
	public static Date getTimeOfDate(Date targetDate, int time) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(targetDate);
		cal.set(Calendar.HOUR_OF_DAY, TimeUtil.convIntegerTimeToIntegerHour(time));
		cal.set(Calendar.MINUTE, TimeUtil.convIntegerTimeToIntegerMinutes(time));
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 時刻操作（秒）
	 * @since	0.0.5
	 * @param targetDate	対象年月日
	 * @return	操作後日付（秒、ミリ秒を0に変更）
	 */
	public static Date convSecondReset(Date targetDate) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(targetDate);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 時刻取得
	 * @since	0.0.5
	 * @param targetDate	対象年月日
	 * @return	HH:mm
	 */
	public static String getStringTimeOfDate(Date targetDate) {
		return MospUtility.getDateString(targetDate, CommonConst.FORMAT_TIME_SHORT);
	}
	
	/**
	 * 日時取得
	 * @since	0.0.5
	 * @param year		年
	 * @param month		月
	 * @param day		日
	 * @param hour		時
	 * @param minute	分
	 * @return	日時
	 */
	public static Date getDate(String year, String month, String day, String hour, String minute) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(getDate(year, month, day));
		cal.set(Calendar.HOUR_OF_DAY, NumberUtil.getIntParam(hour));
		cal.set(Calendar.MINUTE, NumberUtil.getIntParam(minute));
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}
	
	/**
	 * 曜日取得
	 * @since	0.0.6
	 * @param date	対象年月日
	 * @return	曜日
	 * <p>
	 * 1...{@link Calendar#SUNDAY}<br>
	 * 2...{@link Calendar#MONDAY}<br>
	 * 3...{@link Calendar#TUESDAY}<br>
	 * 4...{@link Calendar#WEDNESDAY}<br>
	 * 5...{@link Calendar#THURSDAY}<br>
	 * 6...{@link Calendar#FRIDAY}<br>
	 * 7...{@link Calendar#SATURDAY}<br>
	 * </p>
	 */
	public static int getDayOfWeek(Date date) {
		return MospUtility.getCalendarValue(date, Calendar.DAY_OF_WEEK);
	}
	
	/**
	 * 指定曜日可否メソッド
	 * @param date		対象年月日
	 * @param dayOfWeek	対象曜日
	 * @return
	 * <p>
	 * 対象の曜日だった場合true、そうでない場合false
	 * </p>
	 */
	public static boolean isDayOfWeek(Date date, int dayOfWeek) {
		if (DateUtil.getDayOfWeek(date) == dayOfWeek) {
			return true;
		}
		return false;
	}
	
	/**
	 * 改正労働基準法施行日取得
	 * @return 改正労働基準法施行日(平成22年4月1日)
	 */
	public static Date getLegalReformDate() {
		return convStringBaseDateToDate("20100401");
	}
	
	/**
	 * 年月名称取得
	 * @param targetMonth 対象年月
	 * @return yyyy年MM月
	 */
	public static String convDateToJPYearMonth(Date targetMonth) {
		return MospUtility.getDateString(targetMonth, CommonConst.FORMAT_YEAR_MONTH_JP);
	}
	
	/**
	 * 年月名称取得
	 * @param targetMonth 対象年月
	 * @return yyyy年 M月
	 */
	public static String convDateToJPYearMonthShort(Date targetMonth) {
		return MospUtility.getDateString(targetMonth, CommonConst.FORMAT_YEAR_MONTH_JP_SHORT);
	}
	
}
