アプリ版:「スタンプのみでお礼する」機能のリリースについて

javascriptで 2008/08/32 など正しい日付かどうかチェックしたいのですが
どうしたらよいでしょうか?
日付のシリアル値の求め方も知りたいです。
あと、正規表現を使って上の日付を年・月・日に分けたいのですがどうしたら良いでしょうか。

A 回答 (8件)

復活!これならいいかも?


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);
}
    • good
    • 0

正しい曜日は返さないことが判明。

忘れておくれ
    • good
    • 0

再度訂正です。

差し替えてください

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]);
で「木」になります
    • good
    • 0

ごめん。

もしかして
.split(/なんたら/g)
の部分にgが必要だったかも?
    • good
    • 0

たぶんエクセルのシリアル値ということで


<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>
    • good
    • 0

書き直した


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;
}
    • good
    • 0

日付チェック!


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
とか
    • good
    • 0

関数を自作した。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dt …
<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>
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!