/*!
@brief 時間関係ラッパー
*/
#ifndef DKUTIL_TIME_HPP
#define DKUTIL_TIME_HPP


#include <dkutil_c/dkcOSIndependent.h>

/*!
現在時刻を得ます
@param buff[out] 文字列バッファを指定します
@param buffsize[in] バッファサイズを入れます
@param Sysflag[in] trueだとシステムタイム(確か世界標準時)を取得します。<br>
falseだとローカルタイム(日本の場合は日本の標準時)を取得します。
<font color=red>注意：</font><br>
Windowsの設定により、ローカルタイムは変化するようです。<br>
例えば、日本語版Windowsを使っていても、
スペインの標準時にWindowsを設定していたらそれがバッファ内に反映されると思います。<br>
(テストしていないのでまったく分かりません)<br>
*/
///現在時刻の文字列を得ます
DKC_EXTERN void WINAPI dkcGetCharOfTimeUpToMinute(char *buff,size_t buffsize,BOOL Sysflag);
///日本語版Windowsに標準装備のメモ帳のF5キーを押すと出力される現在の時間を出力します。
///後はGetCharOfTimeUpToMinuteの引数と同じです。
DKC_EXTERN void WINAPI dkcGetCharOfMemoPadTypeTime(char *buff,size_t buffsize);
///システムタイムを詳細まで文字列にします。引数についてはGetCharOfMemoPadTypeTimeを見てください
DKC_EXTERN void WINAPI dkcGetCharOfSystemTimeAll(char *buff,size_t buffsize);
///ローカルタイム(日本語版Windowsの場合は日本の標準時)を文字列にして詳細にわたって表示します。
///文字列内も曜日は日本語なので注意してください。引数についてはGetCharOfMemoPadTypeTimeを見てください。
DKC_EXTERN void WINAPI dkcGetCharOfLocalTimeAllJapanese(char *buff,size_t buffsize);


#ifdef __cplusplus

namespace dkutil{





/// 閏年(leap year)かどうかを確かめる。
/// 閏年であれば真、さもなくば偽を返す
inline bool IsLeapYear( int Year )
{
	return (((Year%4)==0)&&((Year%100)!=0)||((Year%400)==0));
}//IsLeapYear



/// 指定された月の最終日を返す
/// 入力された月が不正（１月〜12月の範囲外）であれば０を返す
inline int DaysInMonth( int nYear, int nMonth )
{
	const int nDaysInMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	if ( ( nMonth < 1 ) || ( nMonth > 12 ) ) return 0;
	if ( (2 == nMonth) && IsLeapYear(nYear) ) return 29;

	return nDaysInMonth[nMonth-1];
}//DaysInMonth

/*! 有効な日付かどうかを確かめる。<br>
  1 <= 月 <= 12<br>
  1 <= 日 <= その月の最終日<br>
 で有効<br>
*/	
/// 有効な日付であれば真、さもなくば偽を返す
inline bool IsGoodDate( int Year, int Month, int Day )
{
	return ((Month>=1)&&(Month<=12)&&(Day>=1)&&(Day<=DaysInMonth(Year,Month)));
}//IsGoodDate

/// グレゴリウス歴(Gregorian calendar)の範囲内かどうかを確かめる。
/// 1582年10月15日以降であれば真、さもなくば偽を返す
inline bool IsGregory( int Year, int Month, int Day )
{
	return ((Year>1582)||((Year==1582)&&((Month>10)||((Month==10)&&(Day>=15)))));
}//IsGregory


}//end of dkutil namespace


#endif
#ifndef DKUTIL_TIME_C
#	include <dkutil/detail/time.c>
#endif

#endif