2009/02/28

VBScriptで日付処理 そにょ1・・・


Excelのシート上なら Text関数、VBA (VisualBasic for Application) なら Format関数、
VisualBasicシリーズなら・・・って、列挙するまでも無く、既存関数で可能な、全く必要のない処理なのだが、
VBScriptでは、ハナシが違ってくる。

そもそも、VBS(WSH WindowsScriptingHost 現WindowsScriptHost)は、古来w
日付処理すら内部に持たない動作環境だった・・・
わざわざ、Windowsのプロセスをオブジェクトとして呼び出して、ソコから取得していた時代がww

それが、あれよ×2 と拡張され、簡単に呼び出せるようになったまでは良かったのだが、
完全な書式指定処理は内包せず、システムの設定依存となってしまった・・・
ちょっと処理すれば、桁揃え程度は誰でも出来る記述だったが、イマイチ汎用性に欠いてしまう・・・

いろんなサイトで同様の処理が列挙されているモノの、
中々、関数として そのまま使え(流用でき)るのが みつからない・・・
ソコで、自分で書いてみた。

    '------------------------------------     
'iDT - 日時文字列 ないし 日/時配列取得 for VBScript
'- Created by LazwardFox -

'LastUpdate 20090228 0458

Public Function iDT(dSplitter,dtSeparater,tSplitter,Control)
Dim nX, nD, nS, strHNS, sResult
nX = Now()
nD = FormatDateTime(Date(),0)
nS = ":" & Split(CStr(FormatDateTime(nX,3)),":")(2)
strHNS = FormatDateTime(nX,4) & nS
If tSplitter = ":" Then
Else
strHNS = Replace(strHNS,":",tSplitter)
End If
sResult = Cstr(Replace(nD,"/",dSplitter)) & "*" & strHNS
If Control = 0 Then
iDT = Replace(sResult,"*",dtSeparater)
Else
iDT = Split(sResult,"*")
End If
End Function


日時値指定ナシで、今の日時文字列を、欲しいカタチで得たいだけなら、コレで充分

書式)
   iDT (dSplitter,dtSeparater,tSplitter,Control)

dSplitter - DateSplitString (Normal - "/")
dtSeparater - Date/Time SepaleteString (Normal - " ")
tSplitter - TimeSplitString (Normal - ":")
Control - String or Array (0 or 1)

   実行a)
test = iDT("/"," ",":",1)

結果a)
test(0) = yyyy/mm/dd
test(1) = HH:nn:ss

   実行b)
test = iDT(""," ","",0)
結果b)
test = yyyymmdd HHnnss

結果の内容自体は、いずれも文字列

・・・パラメータ無指定によるエラーを、回避する構造にはしていないので注意が必要。
無意味に複雑に感じる向きも少なくないと思うが、スクリプトの短さと共に、
他のvbsファイル作成の際にも流用し易いコトに重点を置いている。
また、Windowsの日付設定[地域のプロパティ]が、インストール既定値であることを前提としている。

コレがVBなら容易に既定値を設定できて楽なのだが、VBSだと型宣言すら思い通りにならんのがクチ惜しい・・・
でもまぁコレなら、それなりに、そのまま流用できると思う。

日付/時刻を繋がった文字列として取得したり、それぞれ分けて、配列として取り出すことで、
呼び出した主処理上で、使い分けが利くようになっている。
また、日付時刻関数 FormatDateTime の癖を利用しているのも特徴だ。

肝心の処理だが、主たるは、▼コレ。
   FormatDateTime(Date[,NamedFormat])    


まず、コイツに、日付のみ(Date関数)を投入することで、確実に日付文字列を確保する。
   nD = FormatDateTime(Date(),0)    

NamedFormatパラメータ 0 (ないし、省略 vbGeneralDate)で、yyyy/mm/dd形式の文字列を得られる。
うっかりココで Now関数とか入れちゃうと、yyyy/mm/dd H/n/ssが返ってきてしまい、
時/分 の部分だけ、桁が可変で使えない。・・・何故かシステム既定だと H/n になってるのだ。
(このクセさえなければ、そのまま使えて便利なのだが・・・)
しかし、システム設定には触れずに処理させたい!

ってワケで、次に、秒のみを取得する。 FormatDateTime のパラメータに 3 (vbLongTime) を指定すると、
   実行) FormatDateTime(Now(),3)    
結果) H:n:ss
と、既定で秒だけ桁が揃えられて出力されてくるのを利用している。・・・なんでだろ~?ww
Windowsのシステム既定値って・・・(´ヘ`;)

実スクリプトでは、戻り値をコロンで Split(配列化)し、配列番号{(2)}指定で秒の部分のみを取り出している。
ソレをアトでくっつけるので、コロンを事前に付けてあったりする。
   nS = ":" & Split(CStr(FormatDateTime(nX,3)),":")(2)    

更に、時分・・・ FormatDateTime のパラメータを 4 (vbShortTime) を指定、
   実行) FormatDateTime(Now(),4)    
結果) HH:nn

と、桁の揃った時分が返ってくる、ソレに秒の文字列をくっつけて時分秒文字列は完成。
   strHMS = FormatDateTime(nX,4) & nS    


・・・ぶっちゃけ、こう▼書いても同じなんだけどねwww
   strHMS = FormatDateTime(nX,4) & ":" & Split(CStr(FormatDateTime(nX,3)),":")(2)    

あとは、日付文字列とを、どう返すか等を処理しているだけ。
セパレータの指定は、日付処理を色んなカタチで用いるコトの多い方なら、重要さが判ると思う。

ファイル名構築であったり、フォルダ名だったり、はたまたWebのURLだったり、
テキストファイル内への書き込みだったり、etc etc・・・ セパレータは用途によって随分と異なるようでw
主処理で、Replaceカマせばイイだけなんだけど、どうせなら取得時点で完了していたほうが・・・と
手抜き根性がココまでさせたというオチも付き、オアトがヨロしいようで・・・
<FormatDateTime ヘンなクセ>

0 件のコメント:

コメントを投稿