VBScriptで現在日時をYYYYMMDDhhmmssフォーマットで取得すると失敗する落とし穴と回避法

現在日時をYYYYMMDDhhmmssフォーマットで取得したいんだけど、なんだか文字列がおかしいんだよ

しらひと

サンプルコードも載せておきます

Windowsのファイル操作にて日時を扱いたい状況がありました。
YYYYMMDDhhmmssフォーマット、つまり 2021/08/02 23:21:36 だったら、20210802232136 の形式で情報を取得したいというのが、今回の話です。

Windowsのコマンドで日時を取得する

簡単な方法は以下の3つです

  • コマンドプロンプト で %date% コマンドを使う
  • VBScript で Now() 関数を使う
  • PowerShellで Get-Date コマンドを使う

今回は、取得後に「現在時刻の3時間前」も取得したかったので、時刻型の演算が用意されていないコマンドプロンプトは除外し、VBScript で実現しました。

【落とし穴】VBScript の Now() は hourのみゼロパディングされていない。

Now() 関数で 2021/08/02 23:21:36 のように取得できるので、そのまま Replace で不要なものを削除してしまえば良いかと考えると、落とし穴にはまります。

ダメなコード

'これだと0時~9時の間に意図しない動作をする
now_YYYYMMDDhhmmss = Now()
now_YYYYMMDDhhmmss = Replace(now_YYYYMMDDhhmmss, "/", "")
now_YYYYMMDDhhmmss = Replace(now_YYYYMMDDhhmmss, " ", "")
now_YYYYMMDDhhmmss = Replace(now_YYYYMMDDhhmmss, ":", "")

この場合、実行時刻が深夜1時の場合に 2021/08/02 1:21:36 から 2021080212136 という文字列が得られてしまいます。

【回避法】ゼロパディングしてあげれば良い

落とし穴を認識してしまえば、避けることは簡単です。

now_YYYYMMDDhhmmss= Year(datetimeNow)
now_YYYYMMDDhhmmss= now_YYYYMMDDhhmmss & Right("0" & Month(datetimeNow) , 2)
now_YYYYMMDDhhmmss= now_YYYYMMDDhhmmss & Right("0" & Day(datetimeNow) , 2)
now_YYYYMMDDhhmmss= now_YYYYMMDDhhmmss & Right("0" & Hour(datetimeNow) , 2)
now_YYYYMMDDhhmmss= now_YYYYMMDDhhmmss & Right("0" & Minute(datetimeNow) , 2)
now_YYYYMMDDhhmmss= now_YYYYMMDDhhmmss & Right("0" & Second(datetimeNow) , 2)

ややクドい書き方ですが「左に0を連結した文字列の、右から2桁を取り出す」という操作を行うことで、ゼロパディングすれば、問題が回避できます。

サンプルコード

'現在日時(yyyy/mm/dd hh:mm:ss 形式の文字列)
datetimeNow = Now()
MsgBox datetimeNow '2021/08/02 1:21:36

'ダメな例
now_YYYYMMDDhhmmss = datetimeNow
now_YYYYMMDDhhmmss = Replace(now_YYYYMMDDhhmmss, "/", "")
now_YYYYMMDDhhmmss = Replace(now_YYYYMMDDhhmmss, " ", "")
now_YYYYMMDDhhmmss = Replace(now_YYYYMMDDhhmmss, ":", "")
MsgBox now_YYYYMMDDhhmmss '2021080212136

'良い例
now_YYYYMMDDhhmmss= Year(datetimeNow)
now_YYYYMMDDhhmmss= now_YYYYMMDDhhmmss & Right("0" & Month(datetimeNow) , 2)
now_YYYYMMDDhhmmss= now_YYYYMMDDhhmmss & Right("0" & Day(datetimeNow) , 2)
now_YYYYMMDDhhmmss= now_YYYYMMDDhhmmss & Right("0" & Hour(datetimeNow) , 2)
now_YYYYMMDDhhmmss= now_YYYYMMDDhhmmss & Right("0" & Minute(datetimeNow) , 2)
now_YYYYMMDDhhmmss= now_YYYYMMDDhhmmss & Right("0" & Second(datetimeNow) , 2)
MsgBox now_YYYYMMDDhhmmss '20210802012136

コメント