(for Internet Explorer)
Function  IsTimeOnlyDate( aDateTime as Date ) as boolean
Date 型の値が、日付指定のない時刻だけの値であるかどうかを返します。
サンプル:
  IsTimeOnlyDate( CDate("2009/1/1") ) = False
  IsTimeOnlyDate( CDate("13:00") ) = True
(src)
Function  DateAddStr( BaseDate as Date, Plus as string ) as Date
日付時刻の加減算をします。
d = DateAddStr( CDate("2009/1/1"), "+1month 10days" )  '// d = CDate("2009/2/11")
t = DateAddStr( CDate("17:00"), "-8hours" )  '// t = CDate("9:00")
t = DateAddStr( CDate("10:00"), "+1hours -5min" )  '// t = CDate("10:55")
t = DateAddStr( CDate("10:00"), "-1hours -5min" )  '// t = CDate("8:55")
t = DateAddStr( CDate("10:00"), "-1hours  5min" )  '// t = CDate("8:55")
t = DateAddStr( CDate("10:00"), "-1hours +5min" )  '// t = CDate("9:05")
t = DateAddStr( CDate("10:00"), "+2:30" )  '// t = CDate("12:30")
t = DateAddStr( CDate("10:00"), "-2:30" )  '// t = CDate("7:30")
(src)
Plus 引数
先頭は、"+" か "-" を指定します。 先頭の "+" か "-" を省略すると "+" になります。
先頭以外の "+" か "-" を省略すると、それまでの "+" か "-" を引き継ぎます。
時分は、00:00 形式で指定できます。
単位に指定できるキーワードは次のものがあります。
"year", "years", "month", "months", "day", "days"
"hour", "hours", "minute", "minutes", "min", "second", "seconds", "sec"
関連
→ 時間の加減算 (clib)
→ T_Date.vbs # main
テスト
サンプル
サンプル
  echo  "日時の例:2008/06/11, 14:28:01, -1day, -2hours"
  echo  "Enter のみ:"+ limit_str_default
  limit_str = Input( "日時 >" )
  If limit_str = "" Then  limit_str = limit_str_default
  Select Case  Left( limit_str, 1 )
    Case "+", "-" :  limit = DateAddStr( Now(), limit_str )
    Case Else : limit = CDate( limit_str )
  End Select
日時でも、差分(1日前など)でもできる入力
Function  W3CDTF( SourceTimeDate as Date or string ) as string or Date
日時を文字列(W3C-DTF)に変換します。 または、その逆変換をします。
(src)
サンプル
→ T_Date.vbs # W3CDTF
テスト
  W3CDTF( CDate( "2001/2/2 1:15" ) ) = "2001-02-02T01:15:00+09:00"
  W3CDTF( "2001-02-02T01:15:00+09:00" ) = CDate( "2001/02/02 1:15:00" )
  W3CDTF( "2001-02-02T00:00:00Z" ) = CDate( "2001/02/12 9:00" )
日本(UTC+9時間)の場合
0000
0000-00
0000-00-00
0000-00-00T00:00+00:00
0000-00-00T00:00:00+00:00
0000-00-00T00:00:00.0+00:00
YYYY-MM-DDThh:mm:ss.sTZD
YYYY-MM-DDThh:mm:ssTZD
YYYY-MM-DDThh:mmTZD
YYYY-MM-DD
YYYY-MM
YYYY
年月日時分秒が 1桁のときは 01 のように 0 をつけること。
年は4桁。小数部は何桁でもよい。
時刻(hh:mm:ss)は、現地の時刻を記述する。
XML などで国際的に使える日時の表記法。 タイムゾーンを考慮している。
ISO 8601:1988 に基づく。 XML Schema の dateTime 型より厳密で単純。
W3Cの標準仕様ではない。
は、"Z", "+00:00", "-00:00" のいずれか。
Function  ConvertTimeZone( DateTime as Date or string, FromTZD as string, ToTZD as string )
            as Date or string
タイムゾーンを変更した時刻を返します。
【引数】
DateTime
FromTZD
変更前の時刻。 Date 型、または W3C-DTF 形式の文字列
変更前のタイムゾーン、または Empty
ToTZD
変更後のタイムゾーン、または Empty
(src)
変更後の時刻。 DateTime 引数と同じ型(Date型または文字列)
返り値
サンプル
  ConvertTimeZone( "2002-02-02T11:02:02+09:00", "+09:00", "Z" ) = "2002-02-02T02:02:02Z"
  ConvertTimeZone( CDate("2:02"), "Z", "+9:00" ) = CDate("11:02")
→ T_Date.vbs # ConvertTimeZone
テスト
DateTime に W3C-DTF を指定するときは、FromTZD は Empty または、DateTime に指定した
タイムゾーンと同じタイムゾーンを指定できます。

DateTime に Date 型を指定するときに、FromTZD を Empty にすると、現在 OS に設定されている
タイムゾーンを指定したことと同じになります。

ToTZD に Empty にすると、現在 OS に設定されているタイムゾーンを指定したことと同じになります。
Function  TimeZoneDesignator( MinuteBias as integer ) as string
W3C-DTF のタイムゾーンの部分の文字列を返します。
【引数】
MinuteBias
時差。単位は分。 Empty = OS に設定されているタイムゾーン
W3C-DTF のタイムゾーンの部分
返り値
(src)
サンプル
  TimeZoneDesignator( 540 ) = "+09:00"
  TimeZoneDesignator( Empty ) = "+09:00"  '// 日本の場合
→ T_Date.vbs # TimeZoneDesignator
テスト
Function  MinusTZD( MinuteBias as integer ) as string
W3C-DTF のタイムゾーンの部分の文字列をマイナスにして返します。
【引数】
MinuteBias
時差。単位は分。 Empty = OS に設定されているタイムゾーン
W3C-DTF のタイムゾーンの部分のマイナス
返り値
サンプル
  MinusTZD( 540 ) = "-09:00"
  MinusTZD( Empty ) = "-09:00"  '// 日本の場合
→ T_Date.vbs # MinusTZD
テスト
(src)
Sub  BenchStart()
全体の処理時間の計測を開始します。
ファイル:
vbslib.vbs
BenchStart
For Each x  In Items
  Bench  1
    '// セクション1の計測区間
  Bench  2
    '// セクション2の計測区間
  Bench  0
Next
BenchEnd
Pause
サンプル
Benchmark Result:
Sampling Count = 1401
Max is Section 2
Section 1:   3times   0.032(sec)
Section 2:   3times   0.102(sec)
計測結果の表示例
テスト
→ T_Date.vbs # T_Bench
(src)
Sub  Bench( SectionNum as integer )
セクション(全体の中の一部の区間)の処理時間の計測を開始します。
参考
【引数】
SectionNum
セクションの識別番号
計測するセクションの開始位置に、SectionNum に1以上の値を指定して、Bench を呼び出してください。
計測するセクションの終了位置に、SectionNum に0を指定して、Bench を呼び出してください。
計測するセクションの終了位置が、次のセクションの開始位置であるときは、SectionNum に0を指定
しなくても、次のセクションの識別番号を指定できます。
ファイル:
vbslib.vbs
(src)
参考
Sub  BenchEnd()
全体の処理時間の計測を終了し、計測結果を表示します。
ファイル:
vbslib.vbs
(src)
  Set  vars = CreateObject( "Scripting.Dictionary" )
  vars.Item( "a" ) = 2
  Assert  CalculateVariables( "a + 3", vars ) = 5
Function  CalculateVariables( Formula as string, Variables as dictionary ) as variant
文字列で表現された計算式を計算します。
【引数】
Formula
Variables
計算式。 VBScript の文法で表現したもの
計算式で使える変数の集合
返り値
計算結果
ファイル:
vbslib.vbs
関連
テスト
"a + 3"
サンプル
(src)
計算式に、Variables 引数に指定した変数を使うことができます。
変数の値は、数値だけでなく、文字列やオブジェクトも指定できます。
→ T_Calc.vbs # [T_Calc]
変数の値が文字列型であっても、数値として計算します。
変数の値が他の変数の参照にすることもできます。
  Set  vars = CreateObject( "Scripting.Dictionary" )
  vars.Item( "a" ) = 2
  vars.Item( "b" ) = "3"
  vars.Item( "c" ) = "b"
  Assert  CalculateVariables( "a + b + c", vars ) = 8
  Set pos = new NestPos

  '// pos.PosArr = Array( 0 )

  pos.Start  '// pos.PosArr = Array( 1, 0 )
  pos.End_   '// pos.PosArr = Array( 1 )

  pos.Start    '// pos.PosArr = Array( 2, 0 )
    pos.Start  '// pos.PosArr = Array( 2, 1, 0 )
    pos.End_   '// pos.PosArr = Array( 2, 1 )
  pos.End_     '// pos.PosArr = Array( 2 )
処理順序におけるネスト(入れ子)の位置をカウント・アップします。
Dim  NestPos::PosArr  as Array of integer
.PosArr
.Start
Sub  NestPos::Start()
.End_
Sub  NestPos::End_()
現在のネストの位置。
配列番号は、ネストの深さに対応します。
ブロックの開始。
カウント・アップして、配列の要素を1つ増やします。
ブロックの終了。
配列の要素を1つ減らします。
(src)
LetSet
Sub  LetSet( Out as variant, In_ as variant )
In_ がオブジェクトかどうかによって、Out = In_ または Set Out = In_ をします。
(src)
  If IsObject( In_ ) Then  Set Out = In_ Else Out = In_
一般に、LetSet を呼び出すより、上記のコードを記述した方が高速ですが、
In_ に関数や Dictionary::Item などの重い処理を記述するときは、その重い処理を
2度実行させないLetSet の方が高速です。
実装:
サンプル:
  LetSet  v, dic("name")  '//[out] v
Function  get_Object( Name as string ) as Object
静的オブジェクト (または演算器的なオブジェクト) を取得します。
【引数】
Name
取得するオブジェクトのクラス名
返り値
オブジェクト
サンプル:
関連
  Dim  name : name = "ClassA"
  Dim  obj : Set obj = get_Object( name )
Dim  g_ClassA

Function    get_ClassA()  '// has_interface_of ClassI
  If IsEmpty( g_ClassA ) Then _
    Set g_ClassA = new ClassA : ErrCheck
  Set get_ClassA =   g_ClassA
End Function
get_Object は、機能的には、"get_" + Name の関数を呼び出すだけなので、
別途関数を用意する必要があります。
たとえば、Name = "ClassA" なら、get_ClassA の関数が呼ばれます。
ClassI
ClassA
ClassA
ClassA
ClassA
ClassA
ClassA
ClassA
(src)
Name が変数ではないときは、直接 get_ClassA を呼び出すことができます。
  Dim  obj : Set obj = get_ClassA()
new でオブジェクトを生成すると、get_ClassA で取得できるオブジェクトと別の
インスタンスになります。
Name が動的に変わることがないときは、get_ClassA 関数を直接呼び出して
ください。
→ T_GetObject.vbs [T_IncludeObjs1]
テスト
静的オブジェクトが無ければ、エラーになります。
Function  get_ObjectFromFile( ModulePath as string, Name as string ) as Object
スクリプトファイルをインクルードして、静的オブジェクトを取得します。
【引数】
ModulePath
Name
スクリプトファイルのパス
取得するオブジェクトのクラス名
返り値
取得したオブジェクト
  Dim  m : Set m = get_ObjectFromFile( "Lib\SampleLib.vbs", "Sample" )
サンプル: SampleLib.vbs ファイルで定義されている Sample オブジェクトを取得する。
上記サンプルは、下記と同じです。
  include  "Lib\SampleLib.vbs"
  Dim m : Set m = get_Sample()
オブジェクトを取得する部分は、機能的には、"get_" + Name の関数を呼び出すだけなので、
スクリプトファイルの中で、別途関数を定義する必要があります。 参考
(src)
→ T_GetObject.vbs get_ObjectFromFile [T_NewModule]
テスト
(src)
Sub  get_ObjectsFromFile( GetFuncs as string or Array of Function,
                          InterfaceName as string, out_Objs as Array of Object )
静的オブジェクト・スクリプトファイルをすべて取得して一覧できるようにします。
【引数】
GetFuncs
InterfaceName
スクリプトのパス、または include_objs の out_GetFuncs
Empty または、取得するオブジェクトが持つインターフェース
out_Objs
取得したオブジェクトの配列
  get_ObjectsFromFile  "Lib\*_obj.vbs", "ClassI", m_Objs '// [out] m_Objs
サンプル: インクルードと同時に、静的オブジェクトを取得する
  include_objs  "Lib\*_obj.vbs", Empty, m_CreateFuncs '// [out] m_CreateFuncs
  get_ObjectsFromFile  m_CreateFuncs, "ClassI", m_Objs '// [out] m_Objs
サンプル: インクルードした後で、静的オブジェクトを取得する(ファイルを走査しない)
Sub  get_StaticObjects( InterfaceName, out_Obj )
  If IsEmpty( InterfaceName ) or  InterfaceName = "ClassI" Then
    Set  out_Obj = get_ClassA()
  ElseIf InterfaceName = "ClassI2" Then
    out_Obj = Array( get_ClassA(),  get_ClassB() )
  End If
End Sub
静的オブジェクトを一覧できるようにするには、それぞれのスクリプトで、get_StaticObjects
関数を定義する必要があります。 get_ObjectsFromFile や include_objs は、別のスクリプト
ファイルであれば、同じ関数名でも異なる関数インスタンスになります。
参考
→ T_GetObject.vbs [T_IncludeObjs2] [T_IncludeObjs3]
テスト
Sub  include_objs( Wildcard as string, Flags as Empty, out_GetFuncs as Array of Funcion )
静的オブジェクト・スクリプトファイルをインクルードします。
【引数】
Wildcard
Flags
スクリプトファイルのパス、またはフォルダパス
Empty を指定してください
out_GetFuncs
Empty、または、静的オブジェクトを取得する関数の集合
out_CreateFuncs が Empty ではないときのサンプル
include_objs は、インクルードのみ行います。 オブジェクトの生成は、new で生成するか、
get_ObjectsFromFile で行います。
(src)
サンプル: Lib フォルダをインクルードして、その中で定義された ClassA オブジェクトを生成する。
  include_objs  "Lib\*_obj.vbs", Empty, Empty
  Set obj : Set obj = new ClassA : ErrCheck
→ new_X_array
Flags = Empty かつ out_GetFuncs = Empty なら、include で代用できます。
関連
out_GetFuncs は、静的オブジェクトを取得する関数の集合です。 get_ObjectsFromFile の第1引数
に渡すと、文字列を渡したときより高速に処理します。
→ T_GetObject.vbs [T_IncludeObjs1c]
テスト
→ T_GetObject.vbs [T_IncludeObjs3]
→ T_GetObject.vbs [T_IncludeObjsMulti]
→ T_GetObject.vbs [T_IncludeObjsMulti_NoWild]
→ T_GetObject.vbs [T_IncludeObjsEmptyArray]
Sub  get_DefineInfoObject( in_out_Object as DefineInfoClass, FullPath as string )
単純な DefineInfo オブジェクトを生成します。
参考
DefineInfo オブジェクトに FullPath プロパティしか必要ないときのみ使えます。
他のプロパティがあるときは、
(src)
Dim  g_SrcPath
If IsEmpty( g_SrcPath ) Then  MsgBox "This is vbslib object file." : WScript.Quit
Dim  g_Sample_vbs : get_DefineInfoObject  g_Sample_vbs, g_SrcPath
'// g_Sample_vbs.FullPath
サンプル:
Function  get_NameDelegator( Name as string, TrueName as string,
                             InterfaceName as string ) as InterfaceName_Delegator
指定のインターフェースを持った、正式名オブジェクトに委譲する、静的な一般名オブジェクトを取得します。
【引数】
Name
TrueName
一般名。 取得するオブジェクトの Name プロパティ
正式名。 取得するオブジェクトの委譲先 (*1)
InterfaceName
一般名オブジェクトと正式名〜が共通に持つ、インターフェースの名前 (*2)
(src)
一般名オブジェクト (*3)
返り値
(*2)
(*3)
Name と TrueName の組み合わせが初めてのときは、get_NameDelegator の内部で、
new_(InterfaceName)_Delegator 関数を呼び出して、オブジェクトを生成します。
返り値となるオブジェクトにアクセスすると、Name プロパティとオブジェクトの実体の違いを除けば、
正式名オブジェクトにアクセスします。
(ここでは一般名オブジェクト)を生成することができる、new_(InterfaceName)_Delegator
関数が定義されていること。 参考:new_X
と、(InterfaceName) インターフェースを持ったインスタンス
Class NameDelegator  '// defined_as_interface
  Public  Name
  Public Property Get  TrueName() : TrueName = NameDelegator_getTrueName( Me ) : End Property
  Public  m_Delegate ' as ClassA or ClassB or string(before validated)
  Public Property Get  DefineInfo() : Set DefineInfo = m_Delegate.DefineInfo : End Property
End Class

Const  F_ValidateOnlyDelegate = &h40000000
Dim    g_bNeedValidateDelegate
Function  NameDelegator_getTrueName( m )
Sub       NameDelegator_validate( m, Flags )
Function  NameDelegator_getXML( m )
DefineInfo プロパティは、オプションです。
  Public Property Get  DefineInfo() : Set DefineInfo = m_Delegate.DefineInfo : End Property
テスト
→ T_NameDelegator_vbslib フォルダ
参照
場面Aの関数
Name 以外は
参照
場面Aでの Name
場面Bでの Name
ある1つのインスタンス
TrueName
(正式名)
ClassI_Delegator クラス
(一般名)
場面Bの関数
ClassI
ClassI
ClassB
ClassI
ClassA
Name = "ClassN", TrueName = "ClassA"
Name = "ClassN", TrueName = "ClassB"
一般名で選択
参照
一般名と正式名の関係は、1対多、または、多対1があります。
(*1)
(InterfaceName) インターフェースを持った、静的な正式名オブジェクトを取得することができる
get_(TrueName) 関数が定義されていること。 参考:get_Object
get_NameDelegator 関数は、
ものです。 get_NameDelegator 関数は、get_(一般名) 関数の内部からのみ呼ばれるようにしてください。
の内部で呼ばれる get_(一般名) 関数の実装を支援する
サンプル:
Function  get_GeneralObject()
  Set  get_GeneralObject = get_NameDelegator( "GeneralObject", "TrueName", "InterfaceName" )
End Function

Function  get_TrueName() : ... : End Function
Function  new_InterfaceName_Delegator() : ... : End Function
返り値となる一般名オブジェクトは、Name プロパティと委譲元となるオブジェクトの実体の違いを除けば、
同じ1つの正式名オブジェクトとして扱うことができます。 参考: 下記の図の「ある1つのインスタンス」
(src)
Sub  new_ObjectFromStream( out_Obj as object, ClassName as string, Stream as variant )
ストリームから、オブジェクトを1つ生成します。
【引数】
out_Obj
ClassName
(出力) ストリームから生成した1つのオブジェクト、または Empty
生成するオブジェクトのクラス名 (下記)
Stream
XML ストリーム (下記)
ClassName 引数
XML のタグ名がクラス名に対応します。
XML のタグの中の属性まで一致するデータを元にオブジェクトを生成するときは、
XPath と同様に下記のようにします。
Set xml = LoadXML( "Sample.xml", Empty )
new_ObjectFromStream  obj, "ClassA[@attr='value']", xml
参考
→ XPath の [@name='value'] (属性の値)
<Root><ClassA attr="value" ... /></Root>
VBScript コード
XMLデータ
Stream 引数
の引数に指定できるものを指定できます。
new_X に対応した関数の準備
内部で、new_X を呼び出しています。 new_X を使うのに必要な関数を用意する必要が
あります。 たとえば、ABC クラスなら、new_ABC 関数が必要です。
参考
テスト
→ T_ObjectFromStream フォルダ