/*
 * MosP - Mind Open Source Project         http://www.mosp.jp/
 * Copyright (C) 1987-2009 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.part;

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.4
 */
public class DatePart {

	/**
	 * 月差取得
	 * @param date1 終了月
	 * @param date2 開始月
	 * @return 月差(date1 - date2)
	 * @throws Exception
	 */
	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)
	 * @throws Exception
	 */
	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) {
		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, Integer.parseInt(amount));
		return cal.getTime();
	}

	/**
	 * 日付取得（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) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, Integer.parseInt(year));
		cal.set(Calendar.MONTH, Integer.parseInt(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 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) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, Integer.parseInt(year));
		cal.set(Calendar.MONTH, Integer.parseInt(month));
		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  取得対象年
	 * @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);
		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 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.roll(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) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, Integer.parseInt(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 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) {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, Integer.parseInt(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 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) {
		Calendar cal = Calendar.getInstance();
		cal.set(Integer.parseInt(year), Integer.parseInt(month) -1, 1, 0, 0, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}

	/**
	 * 年月取得
	 * @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 日付
	 * @throws ParseException 
	 */
	public static Date getTimeAsDate(String time) {
		Date date = null;
		try {
			date = DateFormat.getTimeInstance(DateFormat.SHORT).parse(time);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		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();
	}

	/**
	 * 選択日を含む一週間の開始日取得
	 * @param date			選択日
	 * @param dayofweek		開始曜日（{@link Calender}の曜日の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 Calender}の曜日の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];
		if (date > 19000101) {
			String strDate = String.valueOf(date);
			arDate[0] = strDate.substring(0, 4);
			arDate[1] = StringPart.removeZero(strDate.substring(4, 6));
			arDate[2] = StringPart.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 NumberPart.getIntParam(convDateToString(getDate(year, month, day)));
	}

	/**
	 * 日付変換(String→int)
	 * @param 	yyyymmdd yyyy-MM-dd
	 * @return yyyyMMdd
	 */
	public static int convStringDateToInteger(String yyyymmdd) {
		return NumberPart.getIntParam(convDateToString(convHyphenDateToDate(yyyymmdd)));		
	}

	/**
	 * 日付変換(int→String)
	 * @param yyyy
	 * @param mm
	 * @param dd
	 * @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 NumberPart.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);
	}

	/**
	 * 日付変換(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 (yyyymmdd.equals("")) {
			for (int i = 0; i < 3; i++) {
				arDate[i] = "";
			}
		} else {
			arDate[0] = StringPart.removeZero(yyyymmdd.split(CommonConst.SEPARATOR_DATE)[0]);
			arDate[1] = StringPart.removeZero(yyyymmdd.split(CommonConst.SEPARATOR_DATE)[1]);
			arDate[2] = StringPart.removeZero(yyyymmdd.split(CommonConst.SEPARATOR_DATE)[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) {
		Calendar cal = Calendar.getInstance();
		cal.set(Integer.parseInt(year), Integer.parseInt(month) - 1, Integer.parseInt(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 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() { 
		StringBuffer datetime = new StringBuffer();
		SimpleDateFormat sdfymd = new SimpleDateFormat(CommonConst.FORMAT_DATE);
		SimpleDateFormat sdfhms = new SimpleDateFormat(CommonConst.FORMAT_TIME);
		datetime.append(sdfymd.format(getSystemDate()));
		datetime.append(" ");
		datetime.append(sdfhms.format(getSystemDate()));
		return datetime.toString();
	}

	/**
	 * 日付取得（String）
	 * @param date
	 * @return 9999-99-99 99:99:99
	 */
	public static String getDateTime(Date date) { 
		StringBuffer datetime = new StringBuffer();
		SimpleDateFormat sdfymd = new SimpleDateFormat(CommonConst.FORMAT_DATE);
		SimpleDateFormat sdfhms = new SimpleDateFormat(CommonConst.FORMAT_TIME);
		datetime.append(sdfymd.format(date));
		datetime.append(" ");
		datetime.append(sdfhms.format(date));
		return datetime.toString();
	}

	/**
	 * 期間中判断
	 * @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 Calender}の曜日の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();
	}

}
