連載

プロフェッショナルVB.NETプログラミング

第5回 日付時刻の取得とフォーマット

(株)ピーデー
川俣 晶
2002/05/14

Page1 Page2 Page3

日付時刻の書式化

 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で使用できる文字の一部でしかない。完全な一覧表はマニュアルを参照すると良いだろう。


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第5回 日付時刻の取得とフォーマット
    1.日付と時刻の相違 
  2.日付時刻の書式化
    3.日付時刻をソースに埋め込む
 
「プロフェッショナルVB.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間