2009/02/28

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


日付の処理だけ、某Format関数を模してみた。・・・あくまで暫定版。
限られた指定方法で、要素を並べ替えられる程度しか機能しないが、
新たに曜日を要素として取得可能になっている。

書式)
   iDTw({tDate}, {tNow}, {sFormat}, {dSplitter}, {tSplitter}, {dtSeparator}, Control)    

{tDate} 日付情報(時間を含まない) Date()ないし等価
{tNow} 時間情報 Now()ないし等価
{sFormat} OutPutFormat (Default - "Y/M/D H:N:S")
{dSplitter} DateSplitString (Normal - "/")
{tSplitter} TimeSplitString (Normal - ":")
{dtSeparater} Date/Time SepaleteString (Default - " ")
Control 0 文字列 / 1 配列化 (Default - 0)


{sFormat}に対し、半角英大文字の、"YMD" で 日付部分を
"W"で曜日を "HN" で 時分を "S" で秒を、それぞれ任意の位置に配置できます。

★オマケ
   "S HNS YMD [W] HN"    
のようなデタラメな呼び出しも可能^_^;


曜日取得処理 GetWeekDay
装飾も含めて好きなように曜日文字列を取得したいが為だけに作成したモノ。
単なる曜日取得と異なり、逆引き検索や対応データへの変換など、
パラメータの適用次第で応用の幅を広げられるようになっている。
また、iDTw を使う場合、変数 strWeekday をPublicで宣言し、
この関数(の結果)を事前に代入しておくコトが必須となる。
なんだか、海外のライブラリ使ってるみたいで使いデ悪くて、お蔵入りさせてたブツではあるがw

書式)
   GetWeekday(YMD, wFormat, WeekdaysString, nDepth)

   YMD - 日付を指定 (Date関数と等価値)
   wFormat - 戻り値に対する装飾を指定 例) " [ W ] "
   WeekdaysString - 曜日のリストを入力 ・・・リストの構成はサンプル参照のことw
   nDepth - リスト中の次元の深さを指定 (0~)


lArray や inArrays は、これらの為に用意したモノとも云える・・・

    '***** ↓↓↓ScriptTitle↓↓↓ *********************************************************     
'GetWeekDay & iDTw & lArray & inArrays
'- Created by LazwardFox -

' スクリプトライブラリの一部

' Release 20090228 1639

'***** ↓↓↓ Decralations ↓↓↓ ******************************************************
Const strWeekdays = "1:月:MON:Mon:Monday,2:火:TUE:Tue:Tuesday,3:水:WED:Wed:Wednesday,4:木:THU:Thu:Thursday,5:金:FRI:Fri:Friday,6:土:SAT:Sat:Saturday,7:日:SUN:Sun:Sunday"
Const vbWq = """"
Public strWeekday

Dim varNow, VarDate, sDa, sDb, sDc, sDd, sDe, testResult


'***** ↓↓↓Main(Test)Routine↓↓↓ ***************************************************
varNow = Now()
varDate = Date()

'Function GetWeekday(YMD,wFormat,WeekdaysString,nDepth)
strWeekday = GetWeekday(varDate,,strWeekdays,3)

sDa = iDTw(varDate,varNow,"YMD [W] HN","/",":",,0) '文字列テスト
sDb = iDTw(varDate,varNow,"YMD",,,,0) '文字列テスト
sDc = iDTw(,,"YMD*[W]*HNS",,,"*",1) '配列テスト
sDd = iDTw(,,"YMDWHNS","",""," ",0) 'スプリッタ無しテスト
sDe = iDTw(,,"YMD [ W ] HNS","",""," ",0) 'スプリッタ無しテスト

testResult = "iDTw(" & "varDate,varNow," & vbWq & "YMD [W] HN" & vbWq & "," & vbWq & "/" & vbWq & "," & vbWq & ":" & vbWq & ",,0) - <String YMD[W]HN> - >>> " & sDa & vbTab & vbCrLf _
& "iDTw(" & "varDate,varNow," & vbWq & "YMD" & vbWq & ",,,,0) - <String YMD Only> - >>> " & sDb & vbTab & vbCrLf _
& "iDTw(" & ",," & vbWq & "YMD*[W]*HNS" & vbWq & ",,," & vbWq & "*" & vbWq & ",1) - <Array iDTw(1)> - >>> " & sDc(1) & vbTab & vbCrLf _
& "iDTw(" & ",," & vbWq & "YMDWHNS" & vbWq & "," & vbWq & vbWq & "," & vbWq & vbWq & "," & vbWq & " " & vbWq & ",0) - <String NoSplitter> - >>> " & sDd & vbTab & vbCrLf _
& "iDTw(" & ",," & vbWq & "YMD [ W ] HNS" & vbWq & "," & vbWq & vbWq & "," & vbWq & vbWq & "," & vbWq & " " & vbWq & ",0) - <String Full> - >>>" & sDe & vbTab

msgbox testResult,,"Test"

'***** ↓↓↓Functions↓↓↓ ***********************************************************
'------------------------------------
'GetWeekDay - 曜日文字列配列化及び取得
'- Created by LazwardFox -

' Update 20090228 1403 inArraysの新版向けに変更
' Update 20090228 0855 配列化関数をinArraysに差し替え
' Update 20090223 1544
' Release 20090223
' Develop 20090223 1018

' GetWeekday(
' YMD - 日付を指定 (Date関数と等価値)
' ,wFormat - 戻り値に対する装飾を指定 例) " [ W ] "
' ,WeekdaysString - 曜日のリストを入力
' ,nDepth - リスト中の次元の深さを指定 (0~)
' )

Function GetWeekday(YMD,wFormat,WeekdaysString,nDepth)
Dim arsWeekdays,arWeekdays
If TypeName(WeekdaysString) = "Error" Then
ElseIf VarType(arWeekdays) = vbArray Then
Else
inArrays WeekdaysString,",:",arWeekdays
End If
If TypeName(wFormat) = "Error" Then
GetWeekday = arWeekdays(Weekday(YMD,2) - 1)(nDepth)
Else
GetWeekday = Replace(wFormat,"W",arWeekdays(Weekday(YMD,2) - 1)(nDepth))
End If
End Function

'------------------------------------
'iDTw - 日時(曜日)文字列 ないし 日/曜日/時 配列取得 for VBScript
'- Created by LazwardFox -

' Update 20090228 1403 inArraysの新版向けに変更
' Release 20090223 1413 iDTから改良

' Control以外のパラメータを省略可

' iDTw (
' {tDate}日付情報(時間を含まない)Date()ないし等価
' ,{tNow}時間情報Now()ないし等価
' ,{sFormat}OutPutFormat(Default - "YMD HNS")
' ,{dSplitter}DateSplitString (Normal - "/")
' ,{tSplitter}TimeSplitString (Normal - ":")
' ,{dtSeparater}Date/Time SepaleteString (Default - " ")
' ,Control0 文字列 / 1 配列化 (Default - 0)
' )

'記述例) iDTw(,,,,,0)- 現在の年月日/時分秒を配列で取得
'iDTw(,,"YMD*W*HNS",,"*",0)- 現在の年月日/曜日/時分秒を配列で取得

'曜日を取得する場合、事前に 変数strWeekdayをPublicで宣言し、
'GetWeekDay を実行、代入しておく必要があります。

Function iDTw(tDate,tNow,sFormat,dSplitter,tSplitter,dtSeparator,Control)
Dim nS, strHNS, arHNS, iHNS, valHNS'Update 20090223 0135

If TypeName(tDate) = "Error" Then
tDate = Date()
End If
If TypeName(tNow) = "Error" Then
tNow = Now()
End If
If TypeName(dSplitter) = "Error" Then
dSplitter = "/"
End If
If TypeName(tSplitter) = "Error" Then
tSplitter = ":"
End If
If TypeName(Control) = "Error" Then
Control = 0
End If
If TypeName(dtSeparator) = "Error" Then
If Control = 1 Then
dtSeparator = "*"
Else
dtSeparator = " "
End If
End If

strS = Split(CStr(FormatDateTime(tNow,3)),":")(2) 'Update 20090223 0951
strHN = FormatDateTime(tNow,4) 'Update 20090223 1428
strHNS = FormatDateTime(tNow,4) & tSplitter & strS 'Update 20090223 0951

If TypeName(sFormat) = "Error" Then
sFormat = "YMD" & dtSeparator & "HNS"
End If

If dSplitter = "/" Then
Else
tDate = Replace(tDate,"/",dSplitter)
End If
If tSplitter = ":" Then
Else
strHNS = Replace(strHNS,":",tSplitter)
End If

sFormat = Replace(sFormat,"YMD",tDate)
sFormat = Replace(sFormat,"HNS",strHNS)
sFormat = Replace(sFormat,"HN",strHN)
sFormat = Replace(sFormat,"S",strS)

If TypeName(sFormat) = "Error" Then
Else
wExist = Instr(1,sFormat,"W",1)
If wExist = 0 Then
Else
sFormat = Replace(sFormat,"W",strWeekday)
End If
End If
If Control = 0 Then
iDTw = sFormat
Else
iDTw = Split(sFormat,dtSeparator)
End If
End Function


'------------------------------------
'lArray - 文字列を1文字ずつバラし、配列として返す
'- Created by LazwardFox -

' Release 20090228 1246

' lArray(
' strLetters - 分解したい文字列
' ,rArray - 戻り値が代入されます。任意の変数名を指定
' )

Function lArray(strLetters, rArray)
Dim Pc, rLetters()
Set objADO = CreateObject("ADODB.Stream")
With objADO
.Type = 2
.Open
.WriteText strLetters
Pc = 0
.Position = 0
Do Until .EOS
ReDim Preserve rLetters(Pc)
rLetters(Pc) = .ReadText(1)
Pc = Pc + 1
Loop
End With
rArray = rLetters
objADO.Close
Set objADO = Nothing
End Function

'------------------------------------
'inArrays - 多次元配列構築
'- Created by LazwardFox -

'配列 及び 文字列から、区切り文字を指定して多重配列を作成し返す。

' inArrays(
' tSources - 区切り文字を含む文字列 ないし、それらで構成された配列
' ,strLimitters - 区切り文字を順番に並べた文字列を指定
' ,arReturn - 戻り値が代入されます。
' )

' Update 20090228 1248 strLimitters指定に、区切り文字 ~(チルダ)不要に。
' Update 20090228 0833 配列のほか、文字列もソースに適用可能に。
' Update 20090223 0917

Function inArrays(tSources, strLimitters, arReturn)
Dim arSources, arLimitters, iLimitter, arInArrays, iSource, Pc
arSources = tSources
lArray strLimitters, arLimitters '< Update 20090228 1248
For Each iLimitter In arLimitters
If VarType(arSources) = 8 Then
arInArrays = Split(arSources,iLimitter)
Else
Pc = 0
ReDim arInArrays(0)
For Each iSource in arSources
ReDim Preserve arInArrays(Pc)
arInArrays(Pc) = Split(iSource,iLimitter)
Pc = Pc + 1
Next
End If
arSources = arInArrays
arInArrays = Null
Next
arReturn = arSources
End Function


更に自由度の高い書式指定機能付スクリプトを作成するので、この分も要らなくなったりするww

似たようなものばかりでアレなんだケド、色んなデータへのアプローチの仕方があるというコトで、
なにかしら参考になっていればいいなぁ・・・(´ヘ`;)
<そのまま使える スクリプト 年月日 曜日 時分秒 文字列 配列変数 取得 Format Text FormatDateTime>

VBScriptで多次元配列 そにょ2・・・


外部関数追加で、スプリット文字列に区切り文字 ~(チルダ)を不要にしてみた。
あと、バラバラに列挙してたスクリプトを、ファイルのままに張ってみたw
ただ、Tabが全部ツブれてしまうんだよね・・・


以下を、空のテキストファイルにコピペして、任意の名前に、拡張子.vbsをつければ動作します。

    '***** ↓↓↓ScriptTitle↓↓↓ *********************************************************     
'lArray & inArrays
'- Created by LazwardFox -

' スクリプトライブラリの一部

' Release 20090228 1330

'***** ↓↓↓ Decralations ↓↓↓ ******************************************************
Const strWeekdays = "1:月:MON:Mon:Monday,2:火:TUE:Tue:Tuesday,3:水:WED:Wed:Wednesday,4:木:THU:Thu:Thursday,5:金:FRI:Fri:Friday,6:土:SAT:Sat:Saturday,7:日:SUN:Sun:Sunday"
Dim arWeekday, sD

'***** ↓↓↓Main(Test)Routine↓↓↓ ***************************************************
arWeekday = Split(strWeekdays,",")
inArrays arWeekday, ":", sD
msgbox sD(2)(3),,"Test"

inArrays strWeekdays, ",:", sD
msgbox sD(2)(3),,"Test"

'***** ↓↓↓Functions↓↓↓ ***********************************************************
'------------------------------------
'lArray - 文字列を1文字ずつバラし、配列として返す
'- Created by LazwardFox -

' Release 20090228 1246

' lArray(
' strLetters - 分解したい文字列
' ,rArray - 戻り値が代入されます。任意の変数名を指定
' )

Function lArray(strLetters, rArray)
Dim Pc, rLetters()
Set objADO = CreateObject("ADODB.Stream")
With objADO
.Type = 2
.Open
.WriteText strLetters
Pc = 0
.Position = 0
Do Until .EOS
ReDim Preserve rLetters(Pc)
rLetters(Pc) = .ReadText(1)
Pc = Pc + 1
Loop
End With
rArray = rLetters
objADO.Close
Set objADO = Nothing
End Function

'------------------------------------
'inArrays - 多次元配列構築
'- Created by LazwardFox -

'配列 及び 文字列から、区切り文字を指定して多重配列を作成し返す。

' Update 20090228 1248 strLimitters指定に、区切り文字 ~(チルダ)不要に。
' Update 20090228 0833 配列のほか、文字列もソースに適用可能に。
' Update 20090223 0917

'inArrays(
' tSources - 区切り文字を含む文字列 ないし、それらで構成された配列
' ,strLimitters - 区切り文字を順番に並べた文字列を指定
' ,arReturn - 戻り値が代入されます。
' )

Function inArrays(tSources, strLimitters, arReturn)
Dim arSources, arLimitters, iLimitter, arInArrays, iSource, Pc
arSources = tSources
lArray strLimitters, arLimitters '< Update 20090228 1248
For Each iLimitter In arLimitters
If VarType(arSources) = 8 Then
arInArrays = Split(arSources,iLimitter)
Else
Pc = 0
ReDim arInArrays(0)
For Each iSource in arSources
ReDim Preserve arInArrays(Pc)
arInArrays(Pc) = Split(iSource,iLimitter)
Pc = Pc + 1
Next
End If
arSources = arInArrays
arInArrays = Null
Next
arReturn = arSources
End Function


lArrayでは、文字列を文字にバラす際、ADODBオブジェクトに文字列を書き込み、
それを先頭から1文字ずつ読み出して、変数へ配列を追加しつつ、値を代入している。

書式)
   lArray (strLetters, rArray)

strLetters - 分解したい文字列
rArray - 戻り値が代入されます。任意の変数名を指定


書式)
   inArrays(tSources, strLimitters, arReturn)

tSourcess - 区切り文字を含む文字列 ないし、それらで構成された配列変数を指定
strLimitters - 区切り文字を、次元の浅さ順に並べた文字列を記述
arReturn - 戻り値(配列)が代入されます。任意の変数名を指定
しっかし、VBScriptでドコまでやるつもりなのか・・・ 書いた本人がクビ傾げてるワ・・・(´ヘ`;)

VBScriptで多次元配列 そにょ1・・・


日付処理の続きを記述する前に、必須スクリプトなど1つ・・・


    '-----------------------------------     
'inArrays - 多次元配列構築
'- Created by LazwardFox -

'配列 及び 文字列から、区切り文字を指定して多次元配列を作成し返す。

' LastUpdate 20090228 0833

Function inArrays(tSources, strLimitters, arReturn)
Dim arSources, arLimitters, iLimitter, arInArrays, iSource, Pc
arSources = tSources
arLimitters = Split(strLimitters,"~")
For Each iLimitter In arLimitters
If VarType(arSources) = 8 Then
arInArrays = Split(arSources,iLimitter)
Else
Pc = 0
ReDim arInArrays(0)
For Each iSource in arSources
ReDim Preserve arInArrays(Pc)
arInArrays(Pc) = Split(iSource,iLimitter)
Pc = Pc + 1
Next
End If
arSources = arInArrays
arInArrays = Null
Next
arReturn = arSources
End Function


書式)
   inArrays(tSources, strLimitters, arReturn)

tSourcess - 区切り文字を含む文字列 ないし、それらで構成された配列変数を指定
strLimitters - 区切り文字を、~(チルダ) で 区切って順番に並べた文字列を記述
arReturn - 戻り値(配列)が代入されます。任意の変数名を指定


説明面倒っちぃので、実例など・・・
  Const strWeekdays = "1:月:MON:Mon:Monday,2:火:TUE:Tue:Tuesday,3:水:WED:Wed:Wednesday,4:木:THU:Thu:Thursday,5:金:FRI:Fri:Friday,6:土:SAT:Sat:Saturday,7:日:SUN:Sun:Sunday"    
Dim arWeekday, sD

'配列を代入
arWeekday = Split(strWeekdays,",")
inArrays arWeekday, ":", sD
msgbox sD(2)(3),,"Test"

'文字列を代入
inArrays strWeekdays, ",~:", sD
msgbox sD(2)(3),,"Test"


上記2つは等価処理なので、結果は同じとなります。▼▼▼ p.s. そにょ2で修正された版です。▼▼▼▼▼▼▼▼▼▼▼▼▼

★上記実行サンプルとの差異
  '文字列を代入
inArrays strWeekdays, ",~:", sD

inArrays strWeekdays, ",:", sD


書式)
   inArrays(tSources, strLimitters, arReturn)

tSourcess - 区切り文字を含む文字列 ないし、それらで構成された配列変数を指定
strLimitters - 区切り文字を、次元の浅さ順に並べた文字列を記述
arReturn - 戻り値(配列)が代入されます。任意の変数名を指定


        '------------------------------------     
'inArrays - 多次元配列構築
'- Created by LazwardFox -

'配列 及び 文字列から、区切り文字を指定して多重化された配列、多次元配列を作成し返す。

' Update 20090228 1248 strLimitters指定に、区切り文字 ~(チルダ)不要に。
' Update 20090228 0833 外部関数 lArray 追加、配列のほか、文字列もソースに適用可能に。
' Update 20090223 0917

' inArrays(
' tSources - 区切り文字を含む文字列 ないし、それらで構成された配列
' ,strLimitters - 区切り文字を順番に並べた文字列を指定
' ,arReturn - 戻り値が代入されます。
' )

Function inArrays(tSources, strLimitters, arReturn)
Dim arSources, arLimitters, iLimitter, arInArrays, iSource, Pc
arSources = tSources
lArray strLimitters, arLimitters '< Update 20090228 1248
For Each iLimitter In arLimitters
If VarType(arSources) = 8 Then
arInArrays = Split(arSources,iLimitter)
Else
Pc = 0
ReDim arInArrays(0)
For Each iSource in arSources
ReDim Preserve arInArrays(Pc)
arInArrays(Pc) = Split(iSource,iLimitter)
Pc = Pc + 1
Next
End If
arSources = arInArrays
arInArrays = Null
Next
arReturn = arSources
End Function

'------------------------------------
'文字列を1文字ずつバラし、配列として返す
'- Created by LazwardFox -

' Release 20090228 1246

' lArray(
' strLetters - 分解したい文字列
' ,rArray - 戻り値が代入されます。任意の変数名を指定
' )

Function lArray(strLetters, rArray)
Dim Pc, rLetters()
Set objADO = CreateObject("ADODB.Stream")
With objADO
.Type = 2
.Open
.WriteText strLetters
Pc = 0
.Position = 0
Do Until .EOS
ReDim Preserve rLetters(Pc)
rLetters(Pc) = .ReadText(1)
Pc = Pc + 1
Loop
End With
rArray = rLetters
objADO.Close
Set objADO = Nothing
End Function

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


更に手抜きで使えるように・・・
って、曜日表示機能付きの別スクリプトを縮小したもの。

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

'LastUpdate 20090228 0514

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


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

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


スクリプト中に On Error Resume Next を宣言してあれば、全パラメータ省略可

   実行a) test = iDT()    


そうでない場合、カンマとControl指定 必須

   実行a) test = iDT(,,,0)    
結果a) test = yyyy/mm/dd HH:nn:ss


   実行b)   test = iDT(,,,1)       
等価) test = iDT("/",,":",1)

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

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

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

   実行e)   test = iDT("","","",0)    
結果e) test = yyyymmddHHnnss

オマケw
   実行f)   test = iDT("*",,"*",1)    
結果f) test(0) = yyyy
test(1) = mm
test(2) = dd
test(3) = HH
test(4) = nn
test(5) = ss


結果の内容自体は、いずれも文字列参考までに・・・

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 ヘンなクセ>