現在日時を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
コメント