連載プロフェッショナルVB.NETプログラミング
|
日付と時刻の相違
日付と時刻の扱いは、Microsoft系BASICの歴史に限ってもすでに激変が起きている。初期のBASICでは、日付と時刻はそれぞれ文字列として扱われており、日付と時刻は別個の情報として扱われていた。VB 6(Visual Basic 6.0)のDate$やTime$はこの時代の名残といえる。しかし、VB 6では日付と時刻は倍精度浮動小数点型の数値として格納され、しかも、日付と時刻が一体の情報として扱われるようになっている。
日付と時刻が一体になって処理されるのは、ある時点から、別のある時点までの時間間隔を計算するときなどに便利である。また、国際化をにらんで、時差を処理しようとすると、時刻の補正だけでは不十分で、時刻と日付を連動して処理しなければならない。そのような観点で、日付と時刻を一体で処理することは意義があると思われる。
さて、どうして、このようなVB 6の仕様の話を書いたかといえば、もしVB 6の日付時刻の仕様を誤解したままVB.NET(Visual Basic .NET)に進むと、混乱が拡大してしまう可能性があるからだ。
まず、日付や時刻を取得する機能を使ったVB 6のサンプル・プログラムを作成してみた。
|
|
日付や時刻を取得する機能を使ったVB 6のサンプル・プログラム1 |
これを実行すると以下のようになる。
|
|
サンプル・プログラム1の実行結果 |
プログラムの2〜3行目と、その結果は誰も異論はないと思う。4〜5行目は現在の日付と時刻を返す関数の文字列バージョンである。当然、結果として見える内容が似ていても、データ型は異なっている。なお、実行結果の3行目で、日付の区切りがスラッシュではなくハイフンになっているのが目に付くが、これはDate$の動作がCalendarプロパティの設定に影響されないという特徴によるものだ。特に理由がない限り、Date$ではなくDateを使うべきだろう。
6行目のNowは現在の日付時刻を、7行目のTimerは午前0時からの経過時間をそれぞれ秒数で返す。8〜10行目は少し難題だ。これを正しく説明できれば、VB 6のDate型を正しく理解していると胸を張る資格がある。実はDate値は、日付だけでなく時刻も含んでいる。一方のTimeの値は、時刻だけでなく日付を含んでいる。
Dateの場合、時刻は00:00:00であり、その日の午前0時である。Timeの場合日付は1899年12月30日となっているが、これはVB 6の日付を扱う起点となる日付である。具体的な起点はというと、値がゼロになる位置を表示させれば分かる。VB 6の日付時刻は倍精度浮動小数点数値で扱われるので、0#の値を渡せば良い。具体的には、プログラムの10行目に書いたとおりである。実行結果を見て分かるとおり、1899/12/30 00:00:00が起点となる。
さて、これとほぼ同じプログラムをVB.NETで記述してみよう。
|
|
サンプル・プログラム1をVB.NETで書き換えたサンプル・プログラム2 |
これを実行すると以下のようになる。
|
|
サンプル・プログラム2の実行結果 |
見てのとおり、一致しない結果がぞろぞろと出てくる。ソースもかなり違う。
まず2行目を見ていただきたい。VB 6のDate関数は、Todayプロパティに変わる。この例では、名前の紛らわしさが発生しているため、Microsoft.VisualBasicを先頭に付けた完全修飾名で指定している。以下も同じである。3行目は、VB 6のTime関数がTimeOfDayプロパティに変わることを示している。この2つの出力結果は結果の1〜2行目であるが、見てのとおり、日付だけ、時刻だけの出力になっていない。これは、すでに説明した通り、日付時刻から文字列に変換するデフォルトのルールが変わったためである。
さて、プログラムの3〜4行目では、Date$がDateStringに、Time$がTimeStringにそれぞれ変わっている。これは名前の変更と考えれば良いだろう。
プログラムの6行目は特に説明は不要だろう。プログラムの7行目の実行結果である、結果の6行目には、VB 6に比べて小数点以下の数値が多く出力されているが、これは日付時刻型が保持する精度が上がったことによるものである。とはいえ、データ型として表現できる精度があがることと、システムが持っているタイマーの精度があがることは別問題である。最後の桁まで有意の値を取得できる訳ではない。
プログラムの10行目と、結果の9行目を見て分かるとおり、VB.NETでは日付時刻の起点は0001/01/01 12:00:00である。ここで注意が必要なのは、結果の1行目の時刻部が00:00:00であるのに、結果の7行目の時刻部は12:00:00になっていることだ。これは時間を変換する際に、12時間制と24時間制の差が出たもので、実際の値は同じプロパティから取得しており、同じものである。
INDEX | ||
連載 プロフェッショナルVB.NETプログラミング | ||
第5回 日付時刻の取得とフォーマット | ||
1.日付と時刻の相違 | ||
2.日付時刻の書式化 | ||
3.日付時刻をソースに埋め込む | ||
「プロフェッショナルVB.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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|