文字列から曜日を返す
function getDay(s) { return ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][new Date(Date.UTC.apply(this,s.match(/(\d{4})?[^\d]*(\d{1,2})[^\d]*(\d{1,2})/).slice(1).map(function(e,i){switch(i){case 0:return e?e:(new Date()).getFullYear();case 1:return e-1;default:return e}}))).getDay()]; } /* getDay("2010/10/15") // Fri getDay("2010年/10/16") // Sat getDay("10/17") //Sun **2010年に実行した場合 getDay("2010/9/1") // Wed getDay("121") // 12月1日と解釈されてWedを返す.こういう場合1201 や 0121のように4桁で書くよね? */
1行で見にくい.
最後の例のように少し穴があるように思われる.
Firefox 3.6 + Firefbug 1.5.4 で動作確認
以下コードの解説
function getDay(s) { return ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][new Date( Date.UTC.apply( // 配列を Date.UTC に渡すため apply, Date.UTC は1970/01/01 00:00:00 (UTC)からの秒数(ミリ秒単位) this, s.match(/(\d{4})?[^\d]*(\d{1,2})[^\d]*(\d{1,2})/) //正規表現が甘い .slice(1) // 元の文字列が配列の一つ目に入っているため2つ目以降を使う .map(function(e,i){ switch(i){ // 配列のインデックスごとに処理 case 0: // year return e ? e: (new Date()).getFullYear(); // 年の指定が無い場合は今年 case 1: // month return e-1; // Date.UTCの月は 0-11 で指定するため default: // date return e } }) ) ).getDay()]; // getDayメソッドは 0-6 を返す }