日付と時刻 : オートメーションのサポート
更新 : 2007 年 11 月
ここでは、日付と時刻の管理に関するクラス ライブラリ サービスの使い方について説明します。以下の内容について説明します。
COleDateTime クラスを使うと、日付と時刻の情報を表現できます。CTime クラスよりこのクラスの方が、より小さい単位で、より長い期間の日付と時刻を表現できます。COleDateTimeSpan クラスは、2 つの COleDateTime オブジェクトの差などで示される経過時間を表します。
COleDateTime と COleDateTimeSpan の 2 つのクラスは、COleVariant クラスと共にオートメーションで使用します。COleDateTime と COleDateTimeSpan は、MFC データベース プログラミングでも使用できますが、日付と時刻を扱う処理で広く使用できます。COleDateTime クラスでは、CTime クラスに比べ、オブジェクトに必要なデータは多くなりますが、より長い期間にわたる日付と時刻をさらに細かい単位で表現できます。COleDateTime クラスでは DATE データ型が使用されており、その扱いには注意が必要です。DATE データ型の詳細については、DATE データ型を参照してください。
COleDateTime オブジェクトでは、西暦 100 年 1 月 1 日から 9999 年 12 月 31 日までの日付と時刻を表せます。COleDateTime オブジェクトは浮動小数点値で、最小単位はおよそ 1000 分の 1 秒です。COleDateTime では、COleDateTime::operator DATE の MFC ドキュメントで定義されている DATE データ型が使用されています。DATE では、実際にはこれより広い範囲が実装されています。COleDateTime の実装では、クラスを扱いやすくするためにこのような範囲が設けられています。
COleDateTime は、ユリウス歴の日付をサポートしていません。グレゴリオ暦の範囲は、西暦 100 年 1 月 1 日まで扱えるようになっています。
COleDateTime は夏時間 (DST) を無視します。次のコード例は、夏時間 (DST) 切り替え日付を含むある期間を計算する 2 種類の方法を比較します。一方は CRT を使用し、もう一方は COleDateTime を使用します。夏時間 (DST) の切り替えは、大部分のロケールで 4 月の第 2 週と 10 月の第 3 週に行われます。
最初の方法では、2 つの CTime オブジェクト time1 と time2 が、標準 C 構造体 tm と time_t を使用して、それぞれ 4 月 5 日と 4 月 6 日に設定されます。このコードは time1 と time2、および両日付間の期間を表示します。
2 番目の方法では、2 つの COleDateTime オブジェクト oletime1 と oletime2 が作成され、time1 と time2 と同じ日付に設定されます。oletime1 と oletime2、および両日付間の期間が表示されます。
CRT では、23 時間の時間差が正確に計算されます。COleDateTimeSpan では、時間差が 24 時間として計算されます。
このサンプル コードの末尾近くで、COleDateTime::Format で正しく期間を表示するための代替手段が使われています。サポート技術情報の「BUG: Format("%D") Fails for COleDateTime and COleDateTimeSpan (Q167338)」を参照してください。
void CDTDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
time_t date1_t, date2_t;
tm date_tm;
date_tm.tm_hour = 12;
date_tm.tm_min = 0;
date_tm.tm_mon = 3;
date_tm.tm_sec = 0;
date_tm.tm_wday = 0; //Day of week (0-6; Sunday = 0)
date_tm.tm_yday = 0;
date_tm.tm_year = 97;
date_tm.tm_isdst = -1; //Positive if Daylight Saving Time is in effect;
//0 if Daylight Saving Time is not in effect;
//Negative if status of DST is unknown.
date_tm.tm_mday = 6;
date2_t = mktime(&date_tm);
date_tm.tm_mday = 5;
date_tm.tm_isdst = 0;
date1_t = mktime(&date_tm);
CTime time1(date1_t), time2(date2_t);
CTimeSpan ts = time2 - time1;
dc.TextOut(0, 0, CString(_T("CTime")));
dc.TextOut(0, 20, time1.Format(_T("%H:%M:%S %A, %B %d, %Y")));
dc.TextOut(0, 40, time2.Format(_T("%H:%M:%S %A, %B %d, %Y")));
dc.TextOut(0, 60, ts.Format(_T("%H:%M:%S and %D days")));
COleDateTime oletime1(date1_t), oletime2(date2_t);
COleDateTimeSpan olets = oletime2 - oletime1;
dc.TextOut(0, 120, CString(_T("COleDateTime")));
dc.TextOut(0, 140, oletime1.Format(_T("%H:%M:%S %A, %B %d, %Y")));
dc.TextOut(0, 160, oletime2.Format(_T("%H:%M:%S %A, %B %d, %Y")));
//Work-around bug in COleDateTime::Format("%D")
CString str;
str.Format(_T("%s and %d days"), (LPCTSTR)olets.Format(_T("%H:%M:%S")),
olets.GetDays());
dc.TextOut(0, 180, str);
}