2017年3月26日日曜日

日時の省略表記を解釈してDateオブジェクトを返す関数

例えば「1110」は「2017/03/26 11:10」と解釈します。
「11/10」の場合は「2017/11/10 00:00」と解釈します。
解釈に失敗した場合でもDateオブジェクトを返しますが、その場合は年月日時分秒のすべてが「NaN」になります。






ソース
<html>
<title>日時を省略表記</title>
<body>
<input id=inp>
<div id=div></div>
</body>
<script>
resizeTo(250,150)
inp.onkeyup=function(){ str2dat(this.value) }
str2dat=function(){
var 桁=function(num,桁数){var str0=num+'', str1=Array(桁数+1).join(0)+num; return (桁数 < str0.length) ? str0 : str1.slice(str1.length-桁数,str1.length)}
var nd=function(){
var toStr=function(フォーマット){
// フォーマットは「YY/MM/DD hh:mm:ss」のような文字列
var d=this.dat, obj={Y:d.getFullYear(), M:d.getMonth()+1, D:d.getDate(), h:d.getHours(), m:d.getMinutes(), s:d.getSeconds()}, chr, reg, res
for(chr in obj){
reg = new RegExp(chr+'+')
res = フォーマット.match(reg)
if(!res){continue}
フォーマット = フォーマット.replace(reg, 桁(obj[chr], res[0].length))
}
return フォーマット
}
return function(d){
return { dat:d || (new Date()), toStr:toStr }
}
}()
var R=RegExp
var rY=/^[^\d]*(\d{4})\//, rMD=/(\d{1,2})\/(\d{1,2})/, rHM=/(\d{1,2}):(\d{1,2})/, rYMD=/(\d{4})\/?(\d{2})\/?(\d{2})/, rFull=/(\d{4})\/?(\d{2})\/?(\d{2}) *(\d{2}):?(\d{2})/, rD2D2=/(\d{2})(\d{2})[^\d]*?$/
return function(str){
var str0=str, obj={}, rC=function(){return R.rightContext}
if(str0 && str0.match(rFull)){ obj={Y:R.$1, M:R.$2, D:R.$3, h:R.$4, m:R.$5}, str0='' }
if(str0 && str0.match(rY)){ obj.Y=R.$1, str0=rC() }
if(str0 && str0.match(rMD)){ obj.M=R.$1, obj.D=R.$2, str0=rC() }
if(str0 && str0.match(rHM)){ obj.h=R.$1, obj.m=R.$2, str0=rC() }
if(str0 && str0.match(rYMD)){ obj.Y=R.$1, obj.M=R.$2, obj.D=R.$3, str0=rC() }
if(str0 && str0.match(rD2D2)){ obj.h=R.$1, obj.m=R.$2, str0=R.leftContext }
if(str0 && str0.match(rD2D2)){ obj.M=R.$1, obj.D=R.$2, str0=R.leftContext }
var d=nd(), str1=[obj.Y || d.toStr('Y'), obj.M || d.toStr('M'), obj.D || 1].join('/')
if(obj.h){str1 += ' ' + [obj.h || d.toStr('hh'), obj.m || d.toStr('mm'), obj.s || '00'].join(':')}
div.innerText = '['+str1+']'
var dat=new Date(str1)
div.innerText += '\n' + nd(dat).toStr('Y/MM/DD hh:mm:ss')
}
}()
</script>
</html>

0 件のコメント:

コメントを投稿