[PR]

年月日から曜日を求める

戻る

 年月日を数値で入力し、曜日番号(日0、月1、火2、水3、木4、金5、土6、その他7)を返すマクロ、関数を作る。

マクロ:
#define DayOfWeek( year, month, day ) \
( ((month) <= 2) ? ((((year) - 1) + (((year) - 1) / 4) - (((year) - 1) / 100) + (((year) - 1) / 400) + (((13 * ((month) + 12)) + 8) / 5) + (day)) % 7) : ( ((year) + ((year) / 4) - ((year) / 100) + ((year) / 400) + (((13 * (month)) + 8) / 5) + (day)) % 7) )

関数:
//*********************************************************
// GetDayOfWeek()
//   指定された 年月日 が 何曜日 かを求める。
//   何曜日かを示す 曜日番号 を返す。
//   [0 = 日, 1 = 月, 2 = 火, 3 = 水, 4 = 木, 5 = 金, 6 = 土]
//
// int year
//   年 を 西暦 で与える。
//
// int month
//   月 を 1 〜 12 の範囲で指定する。
//
// int day
//   日 を 1 〜 31 の範囲で指定する。
//
//*********************************************************
int // 曜日番号 0-6
GetDayOfWeek
	(
		int year,  // 年 西暦
		int month, // 月 1-12
		int day    // 日 1-31
	)
{
	// 1月 と 2月 を前年の 13月 と 14月 として扱う
	if ( month <= 2 )
	{
		year  -= 1;
		month += 12;
	}

	// 曜日番号を返す
	return 
		(
			day
			+
			((8 + (13 * month)) / 5)
			+
			(year + (year / 4) - (year / 100) + (year / 400))
		)
		%
		7;
}//GetDayOfWeek

 もし、ライブラリの関数mktime() を使用して日付から曜日を求めるならば、次のようである。
 ただし、この方法は、常に曜日が求められるとは限らない。

//*********************************************************
// mktime関数 を使用して日付から曜日を求める。
// 曜日番号(日0、月1、火2、水3、木4、金5、土6、その他7)を返す
//*********************************************************
int DayOfWeek( int Year, int Month, int Day )
{
	struct tm when;

	when.tm_year  = Year  - 1900;
	when.tm_mon   = Month - 1;
	when.tm_mday  = Day;
	when.tm_hour  = 0;
	when.tm_min   = 0;
	when.tm_sec   = 0;
	when.tm_isdst = -1;
	if ( mktime( &when ) == (time_t)-1 )
	{
		return 7; // 計算失敗
	}

	return when.tm_wday;
}//DayOfWeek

関連

指定の年が閏年かどうか判定する
指定の年月日が有効であるか判定する
指定の年月日がグレゴリウス歴の範囲内かどうか判定する



Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
IDGは全世界85カ国でIT関連雑誌を発行する出版社です。