imasara2script
WSHやHTAなどのプログラムサンプルの公開用ブログ
2016年9月5日月曜日
指定日時から相対的な日時を取得するプログラム
用途・目的
「2016/10/1と同じ曜日は、今週だと○月×日」を調べたり
「次の1:00は○月×日 1:00」などを調べたいことがあったので、日時に関するプログラムを作成しました。
ソース
;(function(){ var 二桁=function(num){return (num<10?'0':'')+num} var D=function(d){return d || new Date()} var T=function(t){return new Date(t)} 日時={ get年月日:function(d){ d=D(d); return [ d.getFullYear(), 二桁(d.getMonth()+1), 二桁(d.getDate() )].join('/') }, get時分秒:function(d){ d=D(d); return [二桁(d.getHours()) , 二桁(d.getMinutes()), 二桁(d.getSeconds())].join(':') }, get日時 :function(d){ d=D(d); return this.get年月日(d)+' '+this.get時分秒(d)}, get相対:function(d, str){ var d=D(d), d今=D() switch(str){ case '前日': d.setDate ( d.getDate() -1); return d case '前月': d.setMonth( d.getMonth() -1); return d case '前年': d.setFullYear(d.getFullYear()-1); return d case '前週': d.setDate ( d.getDate() -7); return d case '翌週': d.setDate ( d.getDate() +7); return d case '翌年': d.setFullYear(d.getFullYear()+1); return d case '翌月': d.setMonth( d.getMonth() +1); return d case '翌日': d.setDate ( d.getDate() +1); return d case '今日': return T(this.get年月日()+' '+this.get時分秒(d)) case '今月': d.setFullYear(d今.getFullYear()); d.setMonth(d今.getMonth()); return d case '今年': d.setFullYear(d今.getFullYear()); return d case '今週': var d0day=d今.getDay(), d1day=d.getDay(), 前=-(7-((d1day-(d0day%7)+7)%7)), 後=7-((d0day-(d1day%7)+7)%7) d今.setDate(d今.getDate() + ((Math.abs(前) <= d0day) ? 前 : 後)) return T(this.get年月日(d今)+' '+this.get時分秒(d)) } }, str2dat:function(str){ var d=D() var f=function(str){ if(str.match(/(\d{4}\/\d{1,2}\/\d{1,2} \d{1,2}:\d{1,2})/)){return [T(RegExp.$1) ,'' ] } if(str.match( /(\d{1,2}\/\d{1,2} \d{1,2}:\d{1,2})/)){return [T(d.getFullYear()+'/'+RegExp.$1) ,'年'] } if(str.match( /(\d{1,2} \d{1,2}:\d{1,2})/)){return [T([d.getFullYear(),d.getMonth()+1,''].join('/')+RegExp.$1) ,'月'] } if(str.match( /(\d{1,2}:\d{1,2})/)){return [T(日時.get年月日()+' '+RegExp.$1+':00') ,'日'] } if(str.match( /(\d{1,2}\/\d{1,2})/ )){return [T(d.getFullYear()+'/'+RegExp.$1+' 00:00:00') ,'年'] } } var arr=f(str), dat=arr[0], 単位=arr[1] // 指定された時刻、月日の文字列を元に作成したdateオブジェクトが過去の日時になった場合は // 未来の日時になるように調整する。2016/9/1に「8/30」という文字列を受け取った場合は「2017/8/30」の日付のdateオブジェクトを返す。 if(dat.getTime() < d.getTime()){ return 単位 ? this.get相対(dat, '翌'+単位) : dat } return dat }, get間:function(dat0, dat1){ // dat0 < dat1になっていること。 return forIn( { 年:'getFullYear', 月:'getMonth', 日:'getDate', 時間:'getHours', 分:'getMinutes', 秒:'getSeconds' }, function(単位, 関数名){ if(dat0[関数名]() != dat1[関数名]()){ return '約'+(dat1[関数名]() - dat0[関数名]())+単位+'後' } } ) } } })();
サンプル
;(function(){ var 二桁=function(num){return (num<10?'0':'')+num} var D=function(d){return d ? new Date(d) : new Date()} var T=function(t){return new Date(t)} 日時={ get年月日:function(d){ d=D(d); return [ d.getFullYear(), 二桁(d.getMonth()+1), 二桁(d.getDate() )].join('/') }, get時分秒:function(d){ d=D(d); return [二桁(d.getHours()) , 二桁(d.getMinutes()), 二桁(d.getSeconds())].join(':') }, get日時 :function(d){ d=D(d); return this.get年月日(d)+' '+this.get時分秒(d)}, get相対:function(d, str){ var d=D(d), d今=D() switch(str){ case '前日': d.setDate ( d.getDate() -1); return d case '前月': d.setMonth( d.getMonth() -1); return d case '前年': d.setFullYear(d.getFullYear()-1); return d case '前週': d.setDate ( d.getDate() -7); return d case '翌週': d.setDate ( d.getDate() +7); return d case '翌年': d.setFullYear(d.getFullYear()+1); return d case '翌月': d.setMonth( d.getMonth() +1); return d case '翌日': d.setDate ( d.getDate() +1); return d case '今日': return T(this.get年月日()+' '+this.get時分秒(d)) case '今月': d.setFullYear(d今.getFullYear()); d.setMonth(d今.getMonth()); return d case '今年': d.setFullYear(d今.getFullYear()); return d case '今週': var d0day=d今.getDay(), d1day=d.getDay(), 前=-(7-((d1day-(d0day%7)+7)%7)), 後=7-((d0day-(d1day%7)+7)%7) d今.setDate(d今.getDate() + ((Math.abs(前) <= d0day) ? 前 : 後)) return T(this.get年月日(d今)+' '+this.get時分秒(d)) } }, str2dat:function(str){ var d=D() var f=function(str){ if(str.match(/(\d{4}\/\d{1,2}\/\d{1,2} \d{1,2}:\d{1,2})/)){return [T(RegExp.$1) ,'' ] } if(str.match( /(\d{1,2}\/\d{1,2} \d{1,2}:\d{1,2})/)){return [T(d.getFullYear()+'/'+RegExp.$1) ,'年'] } if(str.match( /(\d{1,2} \d{1,2}:\d{1,2})/)){return [T([d.getFullYear(),d.getMonth()+1,''].join('/')+RegExp.$1) ,'月'] } if(str.match( /(\d{1,2}:\d{1,2})/)){return [T(日時.get年月日()+' '+RegExp.$1+':00') ,'日'] } if(str.match( /(\d{1,2}\/\d{1,2})/ )){return [T(d.getFullYear()+'/'+RegExp.$1+' 00:00:00') ,'年'] } } var arr=f(str), dat=arr[0], 単位=arr[1] // 指定された時刻、月日の文字列を元に作成したdateオブジェクトが過去の日時になった場合は // 未来の日時になるように調整する。2016/9/1に「8/30」という文字列を受け取った場合は「2017/8/30」の日付のdateオブジェクトを返す。 if(dat.getTime() < d.getTime()){ return 単位 ? this.get相対(dat, '翌'+単位) : dat } return dat }, get間:function(dat0, dat1){ // dat0 < dat1になっていること。 return forIn( { 年:'getFullYear', 月:'getMonth', 日:'getDate', 時間:'getHours', 分:'getMinutes', 秒:'getSeconds' }, function(単位, 関数名){ if(dat0[関数名]() != dat1[関数名]()){ return '約'+(dat1[関数名]() - dat0[関数名]())+単位+'後' } } ) } } })(); var obj={現在:new Date()} obj.前日 = 日時.get相対(obj.現在,'前日') obj.翌週 = 日時.get相対(obj.現在,'翌週') obj.仮 = new Date('2016/10/1') obj.今週 = 日時.get相対(obj.仮, '今週') var arr=[],name,i=0 for(name in obj){arr[i++] = name+' : '+日時.get日時(obj[name])} confirm(arr.join('\n'))
動作テスト
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿