imasara2script
WSHやHTAなどのプログラムサンプルの公開用ブログ
2017年3月27日月曜日
相対的日時を取得する関数
用途・目的
「来月1日」とか「先週火曜」のような相対的日時を取得するための関数を作成しました。
ソース
setDate=function(dat0, str条件, swBefore){ // datより後(swBefore=trueなら前)の日時(str条件と一致するタイミング)を返す。 // obj条件の中身は'M1D2'のような形式。'M1D2'なら「1月2日」の意味。 var dat=new Date(dat0), obj={}, reg=/([^\d])(\d+)/, res, objMethod={Y:'setFullYear', M:'setMonth', D:'setDate', h:'setHours', m:'setMinutes'}, chr, T=dat.getTime() while(res=str条件.match(reg)){ obj[res[1]] = res[2]-0 str条件 = RegExp.rightContext } if(obj.Y){ if((swBefore && dat.getFullYear()<obj.Y) || (!swBefore && obj.Y<dat.getFullYear())){ // 条件が矛盾(swBefore=trueなのにdatが2016年、obj.Yは2017とか)の場合は何もしない。 return dat } dat.setFullYear(obj.Y, obj.M-1, obj.D) } while(1){ for(chr in objMethod){ chr!='Y' && isFinite(obj[chr]) && dat[objMethod[chr]](obj[chr]-(chr=='M'?1:0)) } if((swBefore && dat.getTime()<T) || (!swBefore && T<dat.getTime())){break} var 一つ前 for(chr in objMethod){ if(chr=='Y' || !obj[chr]){ 一つ前 = chr continue } dat[objMethod[一つ前]]( dat[objMethod[一つ前].replace(/^set/,'get')]() + (swBefore ? -1:1) ) break } } return dat } setDay=function(dat, 曜日, swBefore){ // 先週月曜、とか来週火曜、のDateオブジェクトを返す。 var num='日月火水木金土'.indexOf(曜日), newD=new Date(dat), num元=newD.getDay() newD.setDate( newD.getDate() + (swBefore ? (num元<num?-7:0) : (num<num元?7:0)) + (num-num元) ) return newD }
サンプル
setDate=function(dat0, str条件, swBefore){ // datより後(swBefore=trueなら前)の日時(str条件と一致するタイミング)を返す。 // obj条件の中身は'M1D2'のような形式。'M1D2'なら「1月2日」の意味。 var dat=new Date(dat0), obj={}, reg=/([^\d])(\d+)/, res, objMethod={Y:'setFullYear', M:'setMonth', D:'setDate', h:'setHours', m:'setMinutes'}, chr, T=dat.getTime() while(res=str条件.match(reg)){ obj[res[1]] = res[2]-0 str条件 = RegExp.rightContext } if(obj.Y){ if((swBefore && dat.getFullYear()<obj.Y) || (!swBefore && obj.Y<dat.getFullYear())){ // 条件が矛盾(swBefore=trueなのにdatが2016年、obj.Yは2017とか)の場合は何もしない。 return dat } dat.setFullYear(obj.Y, obj.M-1, obj.D) } while(1){ for(chr in objMethod){ chr!='Y' && isFinite(obj[chr]) && dat[objMethod[chr]](obj[chr]-(chr=='M'?1:0)) } if((swBefore && dat.getTime()<T) || (!swBefore && T<dat.getTime())){break} var 一つ前 for(chr in objMethod){ if(chr=='Y' || !obj[chr]){ 一つ前 = chr continue } dat[objMethod[一つ前]]( dat[objMethod[一つ前].replace(/^set/,'get')]() + (swBefore ? -1:1) ) break } } return dat } setDay=function(dat, 曜日, swBefore){ // 先週月曜、とか来週火曜、のDateオブジェクトを返す。 var num='日月火水木金土'.indexOf(曜日), newD=new Date(dat), num元=newD.getDay() newD.setDate( newD.getDate() + (swBefore ? (num元<num?-7:0) : (num<num元?7:0)) + (num-num元) ) return newD } confirm( setDate(new Date(), 'D2', 0)+'\n'+ setDay(new Date(), '月', 1) )
動作テスト
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿