年月日と時分秒の書式

Format関数などで日時の書式を表す場合に以下のようなコードを見ることがあります。

「mm」が年月日の「月」と時分秒の「分」の両方に使われています。

一見すると混乱しそうですが、VBAは文脈から自動的に月と分を区別してくれます。

これはVBAに限らず、一般的な年月日や時分秒の表し方で、どちらにも「m」を使うことがあるため、mmの左右の文字列の内容からVBAでも内部的に判定するためです。

具体的には、単体での”mm”は「月」として判断され、時間の”h”や秒の”s”と一緒に使用すると「分」とみなすようになっています。

正式な書式ルール:mは月、nは分

VBAで内部的にmを親切に解釈してくれますが、正式な書式のルールでは「m」は月を表し、分を表すのは「n」になります。

なお、mm、および、nnと2桁で書くと1桁値の場合に左側に0が付与されます。

そのため、正式な年月日+時分秒の書式は
「”yyyy/mm/dd hh:nn:ss”」
になります。

ところが一般的には
「”yyyy/mm/dd hh:mm:ss”」
の方が利用されることが多いです。

Format関数を使うと以下はどちらも同じ時刻を出力します。

注意が必要なケース

上にも書いたとおり、”mm”は単体では「月」として判断されます。

一番問題になるのが、「時分秒」の「分秒」を表したいときです。”hh:mm:ss”の”hh”を除いて”mm:ss”とすると、「分秒」ではなく「月秒」として判断されます。

「分」だけを取得する場合は”mm”単体ではなく、”nn”を使用します。

以下はそれらの注意するパターンです。

hh:mm:ssとhh:nn:ssの処理速度の違い

もしかしたらhh:mm:ssとhh:nn:ssでは処理速度に違いがあるのかも、と思って調べてみました。

結果、差はありませんでした。

hh:mm:ssとhh:nn:ssのFormatを500万回ずつ実行してみましたが、0.01秒の差しかなく、誤差の範囲と思います。

実行結果

61973.04
61977.29 (前回から4.25)
61981.55 (前回から4.26)

結論。mmとnnどっちでもいいけど、分だけのときはnn

結論。

hh:mm:ssとhh:nn:ss、どっちでもいいです。

私自身、hh:mm:ssで書いてますし。

正式な書式を使いたい場合は、分には”nn”を使ってください。

迷う場合や日時書式が厳密に必要な場合は、以下のように定数を使ってFormat関数を使うこともオススメします。