涼の成長記録

自らの人生に主導権を持つべく、独立を目指して2014年3月31日を持ってITエンジニアを退職。そんな23歳♂の成長記録。

TDateTimePickerのTimeプロパティは日付も返す

C++Builderで、日時関連の処理を書く時、System.TDateTimeクラスを使用します。この、TDateTimeクラスの仕様については、以前に書きました。

まず、TDateTimeクラスについて。
System.TDateTime - XE2 API Documentation


つまり、こういうことです。

TDateTime クラスは、日付/時刻値を格納する double 型データ メンバ val を継承します。 TDateTime 値の整数部分は、1899年12月30日からの経過日数です。 TDateTime 値の少数部分は、時刻です。

元記事:条件演算子を使いこなせない - 涼の成長記録


で、時間を表現したい場合は、System.TTimeクラスを使用します。
System.TTime - XE3 API Documentation

TTime は、時間を表すために使用されます。
TTime は、TDateTime 型です。


ここで注意が必要なのは、TTimeは時間を「表す」ための名前なだけであって、結局はTDateTimeなのです。つまり、日付の値が入っていないことを保障するわけではないのです。そして、VCLコンポーネントVcl.ComCtrls.TDateTimePickerが更に私を痛めつけます。
Vcl.ComCtrls.TDateTimePicker - RAD Studio API Documentation

TDateTimePicker は日付または時刻を入力するリストボックスを表示します。
TDateTimePicker は,特に日付と時刻を入力するために設計されたビジュアルコンポーネントです。


つまり、GUIで日付または時刻を入力するためのコンポーネントです。日時の入力範囲チェック等をしなくて良いので、なかなか便利なコンポーネントです。時刻を入力するのであれば、Timeプロパティより時刻情報を取り出します。Timeプロパティの仕様は以下の通りです。
Vcl.ComCtrls.TDateTimePicker.Time - RAD Studio API Documentation

ユーザーが入力した時刻を示します。
Time はユーザーが入力した時刻を表します。


そんなTimeプロパティには罠が2つあります。

  • 型がTTimeではなくTDateTime
  • 日付値も返す


つまり、時刻情報だけでなく日付情報も返ってくるので、小数点以下の値になると保障されているわけではないということです。ここで、どんな弊害があるかというと、私のように横着してCompareTime()を使わずに比較演算子で時刻の比較をしようとした時に問題が出てきます。


例えばSystem.TDateTime.CurrentTime()等の現在時刻(これは本当に時刻情報だけで日付値は0)と比較する場合です。比較演算子を使うと、日付情報も比較されてしまうので、期待の時刻比較ができなくなってしまうのです。つまり、System.DateUtils.CompareTime()を使えということですね。
System.DateUtils.CompareTime - XE2 API Documentation


TTimeクラスに最初から、比較演算子オーバーロードでCompareTime()の結果を返してくれるようにしてくれてばいいのに、なんて贅沢を思ってみたりします。


それにしても、いつもながら日時の扱いが下手くそすぎて嫌になります。そのうち以下を熟読します。
日付および時刻のサポート - RAD Studio XE3


ではでは。