連載
プロフェッショナルVB.NETプログラミング
第5回 日付時刻の取得とフォーマット
(株)ピーデー
川俣 晶
2002/05/14
|
|
日付時刻の書式化
VB 6には、書式を整形するためのFormat関数が存在するが、もちろんこれはVB.NETにも継承されている。しかし、両者の間に完全な互換性があるわけではない。VB 6の書式指定文字はVB 6だけの機能であったが、VB.NETの書式指定は.NET Framework上で他言語と共有されるのである。そのため、挙動が変わる書式指定文字、サポートされない書式指定文字、新規追加される書式指定文字などがある。これらは文字列中に書き込まれているため、コンパイル段階ではチェックできず、見落としやすいので注意が必要である。
では具体的に、両者の相違を見てみよう。まずVB 6で書いたサンプル・プログラムをご覧いただきたい。
1: Private Sub Form_Load()
2: Dim d1 As Date, d2 As Date
3: d1 = #2/3/2001 4:05:06 AM#
4: d2 = #2/3/2001 2:05:06 PM#
5: Debug.Print "日付時刻のFormat"
6: Debug.Print Format(d1, "dddddd")
7: Debug.Print Format(d1, "ddddd")
8: Debug.Print Format(d1, "dddd")
9: Debug.Print Format(d1, "ww")
10: Debug.Print Format(d1, "w")
11: Debug.Print Format(d1, "m")
12: Debug.Print Format(d1, "q")
13: Debug.Print Format(d1, "Nn")
14: Debug.Print Format(d1, "N")
15: Debug.Print Format(d1, "Hh")
16: Debug.Print Format(d1, "H")
17: Debug.Print Format(d1, "ttttt")
18: Debug.Print Format(d1, "AM/PM")
19: Debug.Print Format(d2, "a/p")
20: End Sub
|
|
日付時刻に対してFormat関数を使用したVB 6のサンプル・プログラム3 |
これを実行すると以下のようになる。
1: 日付時刻のFormat
2: 2001年2月3日
3: 2001/02/03
4: Saturday
5: 5
6: 7
7: 2
8: 1
9: 05
10: 5
11: 04
12: 4
13: 4:05:06
14: AM
15: p
|
|
サンプル・プログラム3の実行結果 |
実行結果の2行目から順に見ていくと、「dddddd」は「長い日付」、「ddddd」は「短い日付」、「dddd」は「曜日の長い名前」、「ww」は「年の何番目の週か」、「w」は「週の何番目の日か」。「m」は「先行するゼロの付かない月」、「q」は「四半期」、「Nn」は「先行するゼロを付ける分」、「N」は「先行するゼロを付けない分」、「Hh」は「先行するゼロを付ける時」、「H」は「先行するゼロを付けない時」、「ttttt」はデフォルトの「長い時刻」、「AM/PM」は「フルネームの午前または午後(大文字)」、「a/p」は「1文字の午前または午後(小文字)」となる。
では、これと同じことをVB.NETで記述してみよう。以下が実際のサンプルソースである。
1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
2: Dim d1 As Date, d2 As Date
3: d1 = #2/3/2001 4:05:06 AM#
4: d2 = #2/3/2001 2:05:06 PM#
5: Trace.WriteLine("日付時刻のFormat")
6: Trace.WriteLine(Format(d1, "dddddd"))
7: Trace.WriteLine(Format(d1, "ddddd"))
8: Trace.WriteLine(Format(d1, "dddd"))
9: Trace.WriteLine(Format(d1, "ww"))
10: ' Trace.WriteLine(Format(d1, "w")) 'エラーになる
11: Trace.WriteLine(Format(d1, "m"))
12: ' Trace.WriteLine(Format(d1, "q")) 'エラーになる
13: Trace.WriteLine(Format(d1, "Nn"))
14: ' Trace.WriteLine(Format(d1, "N")) 'エラーになる
15: Trace.WriteLine(Format(d1, "Hh"))
16: ' Trace.WriteLine(Format(d1, "H")) 'エラーになる
17: Trace.WriteLine(Format(d1, "ttttt"))
18: Trace.WriteLine(Format(d1, "AM/PM"))
19: Trace.WriteLine(Format(d2, "a/p"))
20: Trace.WriteLine("VB.NET固有のFormat")
21: Trace.WriteLine(DatePart(DateInterval.Quarter, d1))
22: Trace.WriteLine(Format(d1, "M"))
23: Trace.WriteLine(Format(d1, "mm"))
24: Trace.WriteLine(Format(d2, "HH"))
25: Trace.WriteLine(Format(d2, "hh"))
26: Trace.WriteLine(Format(d1, "%t"))
27: Trace.WriteLine(Format(d2, "%t"))
28: Trace.WriteLine(Format(d1, "tt"))
29: Trace.WriteLine(Format(d2, "tt"))
30: End Sub
|
|
日付時刻に対してFormat関数を使用したVB.NETのサンプル・プログラム4 |
これを実行すると以下のようになる。
1: 日付時刻のFormat
2: 土曜日
3: 土曜日
4: 土曜日
5: ww
6: 2月3日
7: Nn
8: 44
9: 午前
10: A2/P2
11: a/p
12: VB.NET固有のFormat
13: 1
14: 2月3日
15: 05
16: 14
17: 02
18: 午
19: 午
20: 午前
21: 午後
|
|
サンプル・プログラム4の実行結果 |
まずはプログラム・コードを見ていただきたい。実行時にエラーになる行はコメントに変更した。つまり、w、q、N、Hはエラーになり、そのままでは使用できない。一方、プログラム・コードの22〜29行目、出力結果の13〜21行目は、VB.NETで利用できるようになった新しい書式である。
しかし、エラーになっていない書式指定文字であっても、動作が変わっているものがあることに注意しなければならない。「dddddd」(dが6個)と「ddddd」(dが5個)は「dddd」(dが4個)と同じ動作に変更されている。なお、長い日付はVB.NETでは「D」、短い日付は「d」である。また、きちんと日本語対応して「土曜日」が返ってきているのも要注意だ。
次に、「ww」、「Nn」、「a/p」は、それぞれ記述した内容がそのまま表示されていることが分かるだろう。これらは、特別な意味を持った書式指定文字と見なされていない。また、「m」は月と日付を表示するように動作が変わっている。「Hh」は、「H」と「h」の2つが記述されたと判断され、時の値を2回出力した結果、4時が“44”になっている。「ttttt」は後述の「tt」と同じ意味と見なされて、午前または午後に変換するものとして処理されている。「AM/PM」はなかなかに悲惨で、「M」が月を示す文字と解釈され、2月であるため“A2/P2”という実行結果になっている。
さて、VB.NETでの追加分を見てみよう。まずプログラムの21行目は、四半期を得るためのコードだが、これのみFormat関数を使っていない。これは日付を構成する部分を取り出すDatePart関数を経由してアクセスすべきものに変わったためだ。DatePart関数の結果は整数なので、整数として書式を整形すればFormat関数で扱えるのはいうまでもない。DatePart関数は、第1引数で取り出すべき部分を指定し、第2引数で対象となる日付を指定する。
22行目の「M」は、「m」と同じく月と日に変換する。23行目の「mm」は「先行するゼロの付く分」となっている。23行目の「HH」は「24時間表示にした先行するゼロの付く時」、24行目の「hh」は「12時間表示の先行するゼロの付く時」、28〜29行目の「tt」は「午前または午後」となる。さて残された問題は、26〜27行目の「%t」だが、これは午前と午後の先頭の1文字に変換するという機能がある。アメリカでは“AM”と“PM”なので、“A”または“P”に変換されるが、日本では午前と午後なので、どちらも結果が“午”になり、使う意味がない。
ここで紹介した書式指定文字は.NET Frameworkで使用できる文字の一部でしかない。完全な一覧表はマニュアルを参照すると良いだろう。
Insider.NET 記事ランキング
本日
月間