/*!
	DateTools.h

	日付と文字列の相互変換を行う
*/
#pragma once
#include "Time_t.h"

/*!
	文字列 <-> 時刻　相互変換
*/
class CDateTools  
{
public:
	/*!
		文字列(GMT)を時刻に
	*/
	static CTime_t StringToCTime_t(CUTF8String time)
	{
		time.TrimLeft();
		time.TrimRight();
		time.MakeLower();

		//	空？
		if(time.IsEmpty())
			return(-1);

		int	index = time.Find(_U8(","));
		int	day,year,month,hour,minute,second;

		if(index == -1)
		{
			// Sun Nov  6 08:49:37 1994       ; ANSI C の asctime() フォーマット

			//	長さチェック
			if(time.GetLength() < (int)strlen("Sun Nov  6 08:49:37 1994"))
				return(-1);

			//	DayOfWeek
			time = time.Mid(4);

			//	Month
			month = StrToMonth(time.Left(3));
			time = time.Mid(4);

			//	Day
			day = atol(_cnvMBCS(time.Left(2)));
			time = time.Mid(3);

			//	Hour
			hour = atol(_cnvMBCS(time.Left(2)));
			time = time.Mid(3);

			//	Minute
			minute = atol(_cnvMBCS(time.Left(2)));
			time = time.Mid(3);
			
			//	Second
			second = atol(_cnvMBCS(time.Left(2)));
			time = time.Mid(3);
		
			//	Year
			year = atol(_cnvMBCS(time.Left(4)));

			return(GetTime_t(year, month, day, hour, minute, second, TRUE));
		}
		else if(index > 3)
		{
			// Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, RFC 1036 により時代遅れ

			//	長さチェック
			if(time.GetLength() < (int)strlen("Sunday, 06-Nov-94 08:49:37 GMT"))
				return(-1);

			//	DayOfWeek
			time = time.Mid(index + 2);

			//	Day
			day = atol(_cnvMBCS(time.Left(2)));
			time = time.Mid(3);

			//	Month
			month = StrToMonth(time.Left(3));
			time = time.Mid(4);

			//	Year
			year = atol(_cnvMBCS(time.Left(2))) + 2000;
			time = time.Mid(3);

			//	Hour
			hour = atol(_cnvMBCS(time.Left(2)));
			time = time.Mid(3);

			//	Minute
			minute = atol(_cnvMBCS(time.Left(2)));
			time = time.Mid(3);
			
			//	Second
			second = atol(_cnvMBCS(time.Left(2)));
			time = time.Mid(3);

			return(GetTime_t(year, month, day, hour, minute, second, TRUE));
		}
		else if(index == 3)
		{
			// Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, RFC 1123 で改定された

			//	長さチェック
			if(time.GetLength() < (int)strlen("Sun, 06 Nov 1994 08:49:37 GMT"))
				return(-1);

			//	DayOfWeek
			time = time.Mid(index + 2);

			//	Day
			day = atol(_cnvMBCS(time.Left(2)));
			time = time.Mid(3);

			//	Month
			month = StrToMonth(time.Left(3));
			time = time.Mid(4);

			//	Year
			year = atol(_cnvMBCS(time.Left(4)));
			time = time.Mid(5);

			//	Hour
			hour = atol(_cnvMBCS(time.Left(2)));
			time = time.Mid(3);

			//	Minute
			minute = atol(_cnvMBCS(time.Left(2)));
			time = time.Mid(3);
			
			//	Second
			second = atol(_cnvMBCS(time.Left(2)));
			time = time.Mid(3);

			//	安全のため
			if(year < 1980 || year > 2900)
				return(CTime_t(1980,1,1,1,1,1));

			return(GetTime_t(year, month, day, hour, minute, second, TRUE));
		}
		return(0);
	}


	/*!
		GMTで時刻文字列取得
	*/
	static CUTF8String GetGMTString(CTime_t time)
	{
		return(time.FormatGMT(_U8("%a, %d %b %Y %H:%M:%S GMT")));
	}

	/*!
		時刻文字列取得
	*/
	static CUTF8String GetTimeString(CTime_t time)
	{
		return(time.Format(_U8("%Y/%m/%d %H:%M:%S")));
	}

protected:
	/*!
		月を数値に
	*/
	static int StrToMonth(CUTF8String month)
	{
		static wchar_t emonth[12][10]={	_U16("Jan"), _U16("Feb"), _U16("Mar"), _U16("Apr"), _U16("May"), _U16("Jun"),
										_U16("Jul"), _U16("Aug"), _U16("Sep"), _U16("Oct"), _U16("Nov"), _U16("Dec") };
		//	比較してみる
		for(int i=0;i<12;i++)
			if(month.CompareNoCase(emonth[i]) == 0)
				return(i+1);
		return(1);
	}

	/*!
		CTime_t 生成
	*/
	static CTime_t GetTime_t(int year, int month, int day, int hour, int minute, int second, int isGMT)
	{
		//	安全のため
		if(year < 1980 || year > 2900)
			return(CTime_t(1980,1,1,1,1,1));

		//	月
		if(	month < 1)	month = 1;
		if(	month > 12)	month = 12;

		//	日
		if(	day < 0)	day = 0;
		if(	day > 31)	day = 31;

		//	時間
		if(	hour < 0)	hour = 0;
		if(	hour > 23)	hour = 23;

		//	分
		if(	minute < 0)		minute = 0;
		if(	minute > 59)	minute = 59;

		//	秒
		if(	second < 0)		second = 0;
		if(	second > 59)	second = 59;

		//	生成
		CTime_t ret = CTime_t(year,month,day,hour,minute,second);

		//	補正
		if(isGMT)
			ret.ConvertGMTToLocalTime();

		return(ret);
	}
};
