日時をミリ秒まで取得する方法

現在日時をミリ秒まで取得するには以下のようにいくつかの方法があります。

  • GetLocalTime(Win32API)
  • GetSystemTime(Win32API)
  • Timer関数(VBA関数)(時刻のみ)

それぞれの特徴は以下の通りです。

関数 特徴
GetLocalTime SYSTEMTIME型(※)でPCの時刻を取得します。

編集もしやすく使いやすいためオススメです。

GetSystemTime SYSTEMTIME型(※)で日本時間の9時間前の日時(UTC)を取得します。

あまり用途は無いと思います。

Timer 0時からの秒数をミリ秒も含めて取得します。欠点として日付が取得できません。

どうしてもWin32APIを使いたくない場合はこれを使ってください。

UTCなどの詳細を知りたい方は個別に調べてください。

おススメなのはGetLocalTimeです。

上記3つの関数についてそれぞれの使い方を紹介します。

なお、いずれの方法も関数自体やPC環境ごとにミリ秒の精度に誤差があるため、実際の時刻とはどうしても数ミリ秒から数10ミリ秒程度でズレてしまうことは認識しておく必要があります。

1. GetLocalTime

GetLocalTime関数はkernel32ライブラリで定義されている外部プロシージャのため、利用する場合にはDeclareステートメントで利用を宣言しておく必要があります。

また、GetLocalTime関数は日時をSYSTEMTIME構造体で返すため、SYSTEMTIME構造体も一緒に定義しておきます。

使い方は引数にSYSTEMTIME構造体型の変数を渡して呼び出すだけです。

あとはSYSTEMTIME構造体型の変数に入っている日時情報を編集して利用します。

 

2. GetSystemTime

GetSystemTime関数の使い方はGetLocalTime関数と同じです。

 

3. Timer

Timer関数で時分秒とミリ秒を取得する方法です。

例としてこんな感じで取得します。小数点以下は3桁にしています。
12:06:09.480

2つ関数がありますが、1つ目が時分秒とミリ秒をhh:mm:ss.fff形式の文字列で返す関数で、2つ目が呼び出し元です。

Timer関数の結果は秒数+ミリ秒で返ってくるため、整数部分の秒数を時分秒文字列に変換して返すようにしています。

なお、Timer関数で取得できるミリ秒部分はVariant型であれば7桁程度、Double型なら10桁程度ありますが、3桁までを採用しています。

なお、ミリ秒は小数点以下の数値になりますが、Variant型の場合はこの値が0.1未満になった場合、「0.01234567」のように小数点以下が8桁となり、VBAの場合は小数点以下が7桁を超えると指数表記の「1.234567E02」のように保持されます。

変数mをDouble型で定義すれば指数表記にはなりません。

実行結果

F5キーをポンポンポンッと3回を押した場合の実行結果です。

16:22:03.980
16:22:04.125
16:22:04.261

日付を加えたい場合

Timer関数は日付を取れないため、日付を付けたい場合はNow関数の日付部分を利用して連結させると、日付+時刻+ミリ秒で出力することが出来ます。

ただ、レアケースですが注意点があります。

Timer関数とNow関数をそれぞれ実行しなければならないため、どうしてもそれぞれの取得日時にズレが生じます。

その際に、Timer関数実行時の日付とNow関数実行時の日付が異なる場合は、Timer関数の時分秒にNow関数の日付を連結させると、約1日のズレになってしまいます。

ズレを判定するにはTimer関数の時刻と、Date関数もしくはNow関数の時刻が逆転しているかどうかで判定します。

と、ここまで書きましたが、それだけの考慮をするぐらいであれば、最初からGetLocalTime関数を使った方がラクだと思います。