年月日と時分秒の書式
Format関数などで日時の書式を表す場合に以下のようなコードを見ることがあります。
1 |
Format(Now, "yyyy/mm/dd hh:mm:ss") |
“m”が月(month)の部分と分(minute)の両方に使われています。
しかしVBAではちゃんと月と分を区別してくれます。
これはVBAに限らず、一般的な年月日や時分秒の表し方で、どちらにも「m」を使うことがあるため、mmの左右の文字列の内容からVBAでも内部的に判定するためです。
具体的には、時間の”h”や秒の”s”と一緒に使用すると分とみなすようになっています。
mは月、nは分
VBAで内部的にmを親切に解釈してくれますが、正式な書式のルールでは「m」は月を表し、分を表すのは「n」になります。
なお、mm、および、nnと2桁で書くと1桁値の場合に左側に0が付与されます。
そのため、正式な年月日+時分秒の書式は「”yyyy/mm/dd hh:nn:ss”」になります。
Format関数を使うと以下はどちらも同じ時刻を出力します。
1 2 3 4 5 6 7 8 9 10 11 12 |
Sub FormatNowTest() Dim fmt Dim dt dt = Now fmt = Format(dt, "yyyy/mm/dd hh:mm:ss") Debug.Print fmt fmt = Format(dt, "yyyy/mm/dd hh:nn:ss") Debug.Print fmt End Sub |
hh:mm:ssとhh:nn:ssの処理速度の違い
もしかしたらhh:mm:ssとhh:nn:ssでは処理速度に違いがあるのかも、と思って調べてみました。
結果、差はありませんでした。
hh:mm:ssとhh:nn:ssのFormatを500万回ずつ実行してみましたが、0.01秒の差しかなく、誤差の範囲と思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub FormatNowTest2() Dim fmt Dim dt Dim i Dim iMax dt = Now iMax = 5000000 Debug.Print Timer For i = 0 To iMax fmt = Format(dt, "yyyy/mm/dd hh:mm:ss") Next Debug.Print Timer For i = 0 To iMax fmt = Format(dt, "yyyy/mm/dd hh:nn:ss") Next Debug.Print Timer End Sub |
実行結果
61973.04
61977.29 (前回から4.25)
61981.55 (前回から4.26)
結論。どっちでもいい
結論。
hh:mm:ssとhh:nn:ss、どっちでもいいです。
私自身、hh:mm:ssで書いてますし。
正式な書式を使いたい場合は、分にはn、を使ってください。