/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
//	日付扱いクラス
//			変更履歴
//				2004.01.08	新規作成	二條智文
//
package jp.co.ntt.lms.xmo.util;

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

/**
 * XMSⅡでの日付の取り扱いをするユーティリティクラスです。
 * @author T.Nijou
 * @version 0.0.0.1
 */
public class XMODate {

	/**
	 * 日付型データをyyyy/mm/dd型に変換して返します<BR>
	 * 渡された日付オブジェクトがnullの場合はから文字を返します
	 * @param objDate
	 * @param String
	 */
	public static String parseYYYYMMDD( Date objDate ) {
		if( objDate == null ) {
			return "";
		}
		SimpleDateFormat objDateFormat = new SimpleDateFormat("yyyy/MM/dd");

		String strDate = objDateFormat.format( objDate );

		return strDate;
	}

	/**
	 * 日付型データをyyyy/mm/dd HH:mm:ss型に変換して返します<BR>
	 * 渡された日付オブジェクトがnullの場合はから文字を返します
	 * @param objDate
	 * @param String
	 */
	public static String parseTime( Date objDate ) {
		if( objDate == null ) {
			return "";
		}
		SimpleDateFormat objDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

		String strDate = objDateFormat.format( objDate );

		return strDate;
	}

	/**
	 * 日付文字列（parseTimeで文字列変換された文字列）を日付型データに変換して返します<BR>
	 * 渡された文字列がnullの場合はnullを返します
	 * @param date 日付文字列
	 * @param Date
	 */
	public static Date parseTime(String date)
	{
		try
		{
			if (date == null)
				return null;
			
			SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
			return format.parse(date);
		}
		catch (ParseException e)
		{
			e.printStackTrace();
			
			return null;
		}
	}

	/**
	 * 渡された文字列が正しい日付かどうかの判断をします
	 * @param strDate 判定する日付文字列
	 * @return boolean true: 日付 false: 日付ではない
	 */
	public static boolean isDate( String strDate ) {
		DateFormat objDateFormat = DateFormat.getDateInstance();
		objDateFormat.setLenient( false );

		try {
			Date objDate = objDateFormat.parse( strDate );
		}
		catch( ParseException e ) {
			return false;
		}

		return true;
	}

	/**
	 * 渡されたyyyy/MM/dd形式の文字列をその週の先頭（日曜日）の日付に変換して返します。
	 * @param strDate 変換する日付文字列
	 * @return String 変換後の日付文字列<BR>
	 *                （入力文字列がyyyy/MM/dd型の日付フォーマットでない場合または、
	 *                 日付が不正の場合はnullを返す。)
	 */
	public static String moveWeekFirst( String strDate ) {
		if( strDate == null || !isDate( strDate ) ) {
			return null;
		}

		// 日付文字列からカレンダーオブジェクトを生成する
		DateFormat objFormat = new SimpleDateFormat( "yyyy/MM/dd" );
		objFormat.setLenient( false );
		Calendar objCal = new GregorianCalendar();
		try {
			Date objDate = objFormat.parse( strDate );
			objCal.setTime( objDate );
		}
		catch( ParseException pe ) {
			// パースに失敗した場合、日付文字列が不正
			return null;
		}

		// 日曜日の日付に変換します。
		objCal = moveWeekFirst( objCal );

		return parseYYYYMMDD( objCal.getTime() );
	}

	/**
	 * 渡されたyyyy/MM/dd形式の文字列をその週末（土曜日）の日付に変換して返します。
	 * @param strDate 変換する日付文字列
	 * @param strToDate 変換最大日付（変換後の日付が最大日付よりも後の日付の場合はこの日付を返します。)
	 * @return String 変換後の日付文字列<BR>
	 *                （入力文字列がyyyy/MM/dd型の日付フォーマットでない場合または、
	 *                 日付が不正の場合はnullを返す。)
	 */
	public static String moveWeekEnd( String strDate, String strToDate ) {
		if( strDate == null ) {
			return null;
		}

		// 日付文字列からカレンダーオブジェクトを生成する
		DateFormat objFormat = new SimpleDateFormat( "yyyy/MM/dd" );
		objFormat.setLenient( false );
		Calendar objCal = new GregorianCalendar();
		Calendar objToCal = null;
		try {
			Date objDate = objFormat.parse( strDate );
			Date objToDate = null;
			try {
				objToDate = objFormat.parse( strToDate );
				objToCal = new GregorianCalendar();
				objToCal.setTime( objToDate );
			}
			catch( ParseException ppe ) {}
			objCal.setTime( objDate );
		}
		catch( ParseException pe ) {
			// パースに失敗した場合、日付文字列が不正
			return null;
		}

		// 日曜日の日付に変換します。
		objCal = moveWeekEnd( objCal );
		if( objToCal != null && objCal.after( objToCal ) ) {
			objCal = objToCal;
		}

		return parseYYYYMMDD( objCal.getTime() );
	}

	/**
	 * カレンダーを週の頭（日曜日）にします。
	 * @param objCal 変換するカレンダー
	 * @return 変換したカレンダー(入力されたカレンダーがnullの場合はnullを返す)
	 */
	public static Calendar moveWeekFirst( Calendar objCal ) {
		if( objCal == null ) {
			return null;
		}
		Calendar objReturn = (Calendar)objCal.clone();

		int intAddDate = 0;
		switch( objCal.get( Calendar.DAY_OF_WEEK ) ) {
			// 日曜日
			case Calendar.SUNDAY:
				intAddDate = 0;
				break;
			// 月曜日
			case Calendar.MONDAY:
				intAddDate = 1;
				break;
			// 火曜日
			case Calendar.TUESDAY:
				intAddDate = 2;
				break;
			// 水曜日
			case Calendar.WEDNESDAY:
				intAddDate = 3;
				break;
			// 木曜日
			case Calendar.THURSDAY:
				intAddDate = 4;
				break;
			// 金曜日
			case Calendar.FRIDAY:
				intAddDate = 5;
				break;
			// 土曜日
			case Calendar.SATURDAY:
				intAddDate = 6;
				break;
		}

		objReturn.add( Calendar.DAY_OF_YEAR, -intAddDate );

		return objReturn;
	}

	/**
	 * カレンダーを週末（土曜日）にします。
	 * @param objCal 変換するカレンダー
	 * @return 変換したカレンダー(入力されたカレンダーがnullの場合はnullを返す)
	 */
	public static Calendar moveWeekEnd( Calendar objCal ) {
		if( objCal == null ) {
			return null;
		}
		Calendar objReturn = (Calendar)objCal.clone();

		int intAddDate = 0;
		switch( objCal.get( Calendar.DAY_OF_WEEK ) ) {
			// 日曜日
			case Calendar.SUNDAY:
				intAddDate = 6;
				break;
			// 月曜日
			case Calendar.MONDAY:
				intAddDate = 5;
				break;
			// 火曜日
			case Calendar.TUESDAY:
				intAddDate = 4;
				break;
			// 水曜日
			case Calendar.WEDNESDAY:
				intAddDate = 3;
				break;
			// 木曜日
			case Calendar.THURSDAY:
				intAddDate = 2;
				break;
			// 金曜日
			case Calendar.FRIDAY:
				intAddDate = 1;
				break;
			// 土曜日
			case Calendar.SATURDAY:
				intAddDate = 0;
				break;
		}

		objReturn.add( Calendar.DAY_OF_YEAR, intAddDate );

		return objReturn;
	}

	/**
	 * 日付型データをyyyymmdd型に変換して返します<BR>
	 * 渡された日付オブジェクトがnullの場合はから文字を返します
	 * @param objDate
	 * @param String
	 */
	public static String parseOraYYYYMMDD( Date objDate ) {
		if( objDate == null ) {
			return "";
		}
		SimpleDateFormat objDateFormat = new SimpleDateFormat("yyyyMMdd");

		String strDate = objDateFormat.format( objDate );

		return strDate;
	}
	/**
	 * 日付型データをyyyymmddHHMMSS型に変換して返します<BR>
	 * 渡された日付オブジェクトがnullの場合はから文字を返します
	 * @param objDate
	 * @param String
	 */
	public static String parseYYYYMMDDHHmmss( Date objDate ) {
		if( objDate == null ) {
			return "";
		}
		SimpleDateFormat objDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");

		String strDate = objDateFormat.format( objDate );

		return strDate;
	}

}


