Excelのシート上なら Text関数、VBA (VisualBasic for Application) なら Format関数、
VisualBasicシリーズなら・・・って、列挙するまでも無く、既存関数で可能な、全く必要のない処理なのだが、
VBScriptでは、ハナシが違ってくる。
そもそも、VBS(WSH WindowsScriptingHost 現WindowsScriptHost)は、古来w
日付処理すら内部に持たない動作環境だった・・・
わざわざ、Windowsのプロセスをオブジェクトとして呼び出して、ソコから取得していた時代がww
それが、あれよ×2 と拡張され、簡単に呼び出せるようになったまでは良かったのだが、
完全な書式指定処理は内包せず、システムの設定依存となってしまった・・・
ちょっと処理すれば、桁揃え程度は誰でも出来る記述だったが、イマイチ汎用性に欠いてしまう・・・
いろんなサイトで同様の処理が列挙されているモノの、
中々、関数として そのまま使え(流用でき)るのが みつからない・・・
ソコで、自分で書いてみた。
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 の癖を利用しているのも特徴だ。
肝心の処理だが、主たるは、▼コレ。
まず、コイツに、日付のみ(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 ヘンなクセ>