次の方法で共有


日付と時間

MFC は、日時を操作するさまざまな方法をサポートしています。

  • オートメーション DATE データ型のサポート。 DATE では、日付、時刻、日時の値がサポートされます。 COleDateTimeクラスとCOleDateTimeSpan クラスは、この機能をカプセル化します。 これらは、Automation サポートを使用して COleVariant クラスと連携します。

  • 汎用時間クラス。 CTimeCTimeSpan クラスでは、time.h に宣言されている ANSI 標準の時間ライブラリに関連する機能のほとんどがカプセル化されます。

  • システム クロックのサポート。 MFC バージョン 3.0 では、Win32 の SYSTEMTIMEFILETIME のデータ型の CTime にサポートが追加されました。

日付と時刻: オートメーション サポート

COleDateTime クラスは、日付と時刻の情報を表す方法を提供します。 CTime クラスよりも細かい粒度と範囲が提供されます。 COleDateTimeSpan クラスでは、2 つの COleDateTime オブジェクト間の差など、経過時間を表します。

COleDateTimeCOleDateTimeSpan クラスは COleVariant クラスと共に使うように設計されています。 COleDateTimeCOleDateTimeSpan は MFC データベース プログラミングでも役立ちますが、日付と時刻の値を操作する場合はいつでも使用できます。 COleDateTime クラスは CTime クラスよりも値の範囲が広く、細分性も細かいのですが、CTime よりもオブジェクトあたりのストレージが多く必要になります。 また、基となる DATE 型を扱うときには、いくつかの特別な考慮事項があります。 DATE の実装の詳細については、「DATE」を参照してください。

COleDateTime オブジェクトは 100 年 1 月 1 日から 9999 年 12 月 31 日までの日付を表すために使用できます。 COleDateTime オブジェクトは浮動小数点値であり、概算解像度は 1 ミリ秒です。 COleDateTime は、MFC ドキュメントの COleDateTime::operator DATE で定義されている DATE データ型に基づいています。 実際の DATE の実装はこれらの範囲を超えています。 COleDateTime の実装では、このクラスを扱いやすくするためにこの境界を設けています。

COleDateTime はユリウス暦をサポートしていません。 グレゴリオ暦は 100 年 1 月 1 日までさかのぼると想定されています。

COleDateTime では夏時間 (DST) は無視されます。 次のコード例では、DST の切り替え日をまたぐ時間帯を計算する 2 つの方法を比較しています。1 つは CRT を使い、もう 1 つは COleDateTime を使います。

最初のメソッドでは、標準的な C の型構造体 tmtime_t を使って、2 つの CTime オブジェクト (time1time2) がそれぞれ 4 月 5 日と 4 月 6 日に設定されます。 コードには、 time1time2 とそれらの間の期間が表示されます。

2 つ目のメソッドでは、2 つの COleDateTime オブジェクト (oletime1oletime2) が作成され、time1time2 と同じ日付に設定されます。 oletime1oletime2 とその間の時間を表示します。

CRT により、23 時間の差を正しく計算します。 COleDateTimeSpan により 24 時間の差を計算します。

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);
}

現在の時刻を取得します。

次の手順では、COleDateTime オブジェクトを作成し、現在の時刻で初期化する方法について説明します。

現在の時刻に移動するには

  1. COleDateTime オブジェクトを作成します。

  2. GetCurrentTime を呼び出します。

    COleDateTime timeNow;
    timeNow = COleDateTime::GetCurrentTime();   
    

経過時間を計算する

この手順では、2 つの COleDateTime オブジェクトの差を計算し、COleDateTimeSpan の結果を取得する方法を示します。

経過時間を計算するには

  1. 2 つのオブジェクト (COleDateTime) を作成します。

  2. COleDateTime オブジェクトの 1 つを現在の時刻に設定します。

  3. 時間のかかるタスクを実行します。

  4. 他の COleDateTime オブジェクトを現在の時刻に設定します。

  5. 2 つの時刻の差を取得します。

    COleDateTime timeStart, timeEnd;
    timeStart = COleDateTime::GetCurrentTime();
    // ... perform time-consuming task
    timeEnd = COleDateTime::GetCurrentTime();
    COleDateTimeSpan spanElapsed = timeEnd - timeStart;   
    

時刻の書式を設定する

時刻の書式を設定するには

COleDateTime または COleDateTimeSpan のいずれかの Format メンバー関数を使用して、時間または経過時間を表す文字列を作成します。

COleDateTime time(1970, 12, 18, 17, 30, 0);
// 18 December 1970, 5:30 PM
CString s = time.Format(VAR_DATEVALUEONLY);
// s contains the date formatted based on 
// the current national language specifications
// (locale ID). The time portion is ignored for 
// formatting purposes in this case.   

詳細については、COleVariant クラスを参照してください。

日付と時刻: データベース サポート

バージョン 4.0 以降、MFC データベース プログラミングでは、 COleDateTime クラスと COleDateTimeSpan クラスを使用して日付と時刻のデータを表します。 Automation でも使用されるこれらのクラスは、クラス COleVariantから派生します。 日付と時刻のデータを管理するためのサポートは、 CTimeCTimeSpanよりも優れています。

日付と時刻: SYSTEMTIME サポート

COleDateTime クラスには、Win32 からのシステム時刻とファイル時刻を受け入れるコンストラクターがあります。

Win32 FILETIME 構造体は、時間を 64 ビット値として表します。 これは SYSTEMTIME 構造体よりも内部記憶域に便利な形式です。この形式は、ファイルの作成時刻を表すために Win32 によって使われます。 SYSTEMTIME 構造体 の詳細については、SYSTEMTIME に関するページを参照してください。 FILETIME 構造体 の詳細については、FILETIME に関するページを参照してください。

関連項目

概念
MFC の一般的なトピック