- ベストアンサー
日付チェックと正規表現
javascriptで 2008/08/32 など正しい日付かどうかチェックしたいのですが どうしたらよいでしょうか? 日付のシリアル値の求め方も知りたいです。 あと、正規表現を使って上の日付を年・月・日に分けたいのですがどうしたら良いでしょうか。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
関数を自作した。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script type="text/javascript">//<![CDATA[ function isValidDateString(str1){ try{ //実装依存だらけでDate.parseが糞の役にも立ちやしないので var r = new RegExp("^(\\d\\d\\d\\d)/(\\d\\d)/(\\d\\d)$"); r.multiline = false; r.global = true; var arr = r.exec(str1); //引数は現在のロケール! var d = new Date(parseInt(arr[1],10),parseInt(arr[2],10) - 1,parseInt(arr[3],10)); //そのDateから文字列を生成してみる。生成するときは現在のロケールで。 var str2 = [d.getFullYear().toString() ,("0"+(d.getMonth()+1).toString()).slice(-2),("0"+(d.getDate()).toString()).slice(-2) ].join("/"); }catch(e){ alert(e); } return(str1 == str2); } //]]> </script> </head> <body> <ul> <li onclick="alert(isValidDateString('2000/02/29'));">2000/02/29</li> <li onclick="alert(isValidDateString('2004/02/29'));">2004/02/29</li> <li onclick="alert(isValidDateString('2008/08/31'));">2008/08/31</li> <li onclick="alert(isValidDateString('2008/08/32'));">2008/08/32</li> <li onclick="alert(isValidDateString('2100/02/29'));">2100/02/29</li> <li onclick="alert((new Date(2008,7,31)).getTime())">(int)2008/08/31</li> </ul> </body> </html>
その他の回答 (7)
復活!これならいいかも? function dayCount(date_str){ var dy=date_str.split(/\/|-| |:/);for(var i=0;i<6;i++) dy[i]=dy[i]?dy[i]-0:0; var d=(dy[0]-1)*365+((dy[0]-1)/400|0)-((dy[0]-1)/100|0)+((dy[0]-1)/4|0)+[0,0,31,59,90,120,151,181,212,243,273,304,334][dy[1]]+dy[2]+(((!(dy[0]%4))^(!(dy[0]%100))^(!(dy[0]%400)))&(dy[1]>2)); var t=dy[3]/24+dy[4]/1440+dy[5]/86400; return (d+t).toFixed(6); }
正しい曜日は返さないことが判明。忘れておくれ
再度訂正です。差し替えてください 。 function dayCount(date_str){ var dy=date_str.split(/\/|-| |:/);for(var i=0;i<6;i++) dy[i]=dy[i]?dy[i]-0:0; var u=dy[0]%400; var d=(dy[0]-1)*365+(dy[0]/400|0)-(dy[0]/100|0)+(dy[0]/4|0)+[0,0,31,59-(!(dy[0]%400)^!(dy[0]%100)^!(dy[0]%4)),90,120,151,181,212,243,273,304,334][dy[1]]+dy[2]; var t=dy[3]/24+dy[4]/1440+dy[5]/86400; return (d+t).toFixed(6); } 曜日の計算が正しく計算されませんでした(それでも自信がなくなってきた) alert('日 月 火 水 木 金 土'.split(' ')[dayCount('2008/9/4')%7]); で「木」になります
ごめん。もしかして .split(/なんたら/g) の部分にgが必要だったかも?
たぶんエクセルのシリアル値ということで <html> <body> <script type="text/javascript" language="JavaScript"> alert(serial('2008/09/03 12:34:56')); alert('俺が生まれてからすでに、'+(dayCount('2008/09/03')-dayCount('1966/01/12'))+'日が経過した。'); function serial(date_str){ return (dayCount(date_str)-dayCount('1899/12/31')).toFixed(6); } function dayCount(date_str){ var dy=date_str.split(/\/|-| |:/);for(var i=0;i<6;i++) dy[i]=dy[i]?dy[i]-0:0; var d=dy[0]*365+(dy[0]/400|0)-(dy[0]/100|0)+(dy[0]/4|0)+[0,0,31,59,90,120,151,181,212,243,273,304,334][dy[1]]+dy[2]; var t=dy[3]/24+dy[4]/1440+dy[5]/86400; return (d+t).toFixed(6); } </script> </body> </html>
書き直した alert(dateChk('2000/02/29')?'○':'×'); function dateChk(date_str){ if(date_str.match(/[^\d-/]/)) return; var dy=date_str.split(/\/|-/);for(var i in dy) dy[i]-=0; if(dy[0]<1 || dy[1]<1 || dy[1]>12 || dy[2]<1 dy.length!=3) return; if(dy[2]>[0,31,28+(!(dy[0]%400)^!(dy[0]%100)^!(dy[0]%4))*1,31,30,31,30,31,31,30,31,30,31][dy[1]]) return; return true; }
日付チェック! alert(dateChk('2000/02/29')?'○':'×'); function dateChk(date_str){ if(date_str.match(/[^\d-/]/)) return; dy =date_str.match(/^(\d{4})[/-](\d{1,2})[/-](\d{1,2})$/); if((dy[2]-1)/12|0!=0) return; if(((dy[3]-1)/([0,31,28+(!(dy[1]%400)^!(dy[1]%100)^!(dy[1]%4))*1,31,30,31,30,31,31,30,31,30,31][dy[2]-0])|0)==0) return true; } 日付のシリアル値ってエクセルの? 日付の分割 day='2008/02/28'.split('/');for(var i in day) day[i]-=0; day[0]=年、day[1]=月、2が日 例二月だけを取り出すなら mm='2008/02/28'.split('/')[1]-0 とか