2009年2月10日火曜日

JavaScript 祝日計算

ネタに走る…(^^;



/// 休日の判定(振替休日を考慮)

function getHoliday_ja_JP( date ) {

/// 前日の状態を調べる

function checkBeforeDay( date ) {

var yesterday = new Date();

yesterday.setTime( date.getTime() - 24 * 60 * 60 * 1000 );

var week = yesterday.getDay();

// 前日が祝日の場合、振替休日である可能性がある

if( getPureHoliday_ja_JP( yesterday ) != null ) {

// 祝日が日曜日なので

if( week == 0 ) return '振替休日';

return checkBeforeDay( yesterday );

}

return null;

}

var week = date.getDay();

var holiday = getPureHoliday_ja_JP( date );

if( holiday != null ) return holiday;

if( week == 0 ) return null;

var year = date.getFullYear();

if( year >= 1973 ) {

var holiday = checkBeforeDay( date );

if( holiday != null ) return holiday;

if( year >= 2003 && date.getMonth() == 8 ) {

var yesterday = new Date();

yesterday.setTime( date.getTime() - 24 * 60 * 60 * 1000 );

// 注:敬老の日は、月曜日固定

if( getPureHoliday_ja_JP( yesterday ) == '敬老の日' ) {

var tommorow = new Date();

tommorow.setTime( date.getTime() + 24 * 60 * 60 * 1000 );

if( getPureHoliday_ja_JP( tommorow ) == '秋分の日' ) {

return '国民の祝日';

}

}

}

}

return null;

}



/// 祝日の判定(振替休日を考慮しない)

function getPureHoliday_ja_JP( date ) {

var week = date.getDay();

var year = date.getFullYear();

var day = date.getDate();

switch( date.getMonth() ) {

case 0:

// 元旦

if( day == 1 ) return '元旦';

// 成人の日

if( year >= 2000 ) {

if( week == 1 && 7 < day && day < 15 ) return '成人の日';

} else if( day == 15 ) { return '成人の日'; }

break;

case 1:

// 建国記念日

if( year >= 1967 ) {

if( day == 11 ) return '建国記念日';

}

break;

case 2:

// 春分の日 正確には観測による。下記式は 1980年から2099年の間有効

if( day == (

Math.floor( 20.8431+.242194 * (year -1980.0))

- Math.floor( (year - 1980.0) / 4.0 )

) ) return '春分の日';

break;

case 3:

if( day == 29 ) {

if( year <= 1988 ) return '天皇誕生日';

if( year <= 2006 ) return 'みどりの日';

return '昭和の日';

}

break;

case 4:

if( day == 3 ) return '憲法記念日';

if( day == 5 ) return 'こどもの日';

if( day == 4 ) {

if( year < 1988 ) return null;

if( year <= 2006 ) {

if( week == 0 ) return null;

if( week == 1 ) return null; // 振替休日は祝日としない

return '国民の祝日';

}

//if( year >= 2007 )

return 'みどりの日';

}

break;

case 5:

// for (;_;) oh;

break;

case 6:

// 海の日

if( year >= 2003 ) {

if( week == 1 && 14 < day && day < 22 ) return '海の日';

} else if( day == 20 && year >= 1996) { return '海の日'; }

break;

case 7:

// 盆休み(不定)

break;

case 8:

// 敬老の日

if( year >= 2003 ) {

if( week == 1 && 14 < day && day < 22 ) return '敬老の日';

} else if( day == 15 && year >= 1966 ) { return '敬老の日'; }

// 秋分の日 正確には観測による。下記式は 1980年から2099年の間有効

if( day == (

Math.floor( 23.2488+.242194 * (year -1980.0))

- Math.floor( (year - 1980.0) / 4.0 )

) ) return '秋分の日';

break;

case 9:

// 体育の日

if( year >= 2000 ) {

if( week == 1 && 7 < day && day < 15 ) return '体育の日';

} else if( day == 10 && year >= 1966 ) { return '体育の日'; }

break;

case 10:

// 文化の日・勤労感謝の日

if( day == 3 ) return '文化の日';

if( day == 23 ) return '勤労感謝の日';

break;

case 11:

// 天皇誕生日

if( day == 23 && year >= 1989 ) return '天皇誕生日';

break;

default:

}

return null;

}

0 件のコメント: