アプリケ-ションを作成する時に、日付や時刻を扱うことは良くありますね。C++Builderには、日付や時刻を簡単に処理できる便利なクラス/関数があります。
time()関数
C++BuilderもC/C++言語ですから、標準関数のtime()関数が使用できます。
time()関数の概要
以下の表は、time()関数の概要です。
項目 | 内容 |
---|---|
ヘッダーファイル | time.h |
プロトタイプ | time_t time(time_t *timer); |
説明 | 時刻を取得します。 |
詳細 | time は,GMT 1970 年 1 月 1 日 00 時 00 分 00 秒からの経過時間(秒単位)を提供し,timer がヌルポインタでない場合は,その値を timer が指す場所に格納します。 |
戻り値 | time は,経過時間(秒単位)を返します。 |
例
#include <time.h>
#include <stdio.h>
int main(void)
{
time_t t;
t = time(NULL);
printf("The number of seconds since January 1, 1970 is %ld",t);
return 0;
}
time関数の値は、time_tとなっていますが、time_tが符号付き32ビット整数型の場合は、取り扱えるのは2,147,483,647秒(≒ 68年)「2038年1月19日3時14分7秒(日本標準時では2038年1月19日12時14分7秒)」となり、それを超えた日時は正確に取り扱えないことになります。これが、2038年問題と言われています。
TDateTimeクラス
TDateTime は、Delphi の TDateTime 型に相当する C++ の型です。
TDateTime は、Delphi の TDateTime データ型と、TDateTime データ型を使用する日付/時刻関連のランタイム ライブラリ ルーチンを実装したものです。
TDateTime クラスは、日時値を保有する val データ メンバ(double 値として宣言される)を継承します。TDateTime 値の整数部分は、1899年12月30日からの経過日数です。TDateTime 値の小数部分は、その日の時刻です。TDateTime 値でサポートされている正しい日時の上限は 12/31/9999 23:59:59:999 です。 値がこの日時を上回ると必ず、TDateTime 値を操作する大半のルーチンでエラーや例外が発生します。
TDateTime は、負の値もサポートしています。TDateTime の負の値を使用する際には、注意が必要です。負の値を誤って使用すると、さまざまな問題を引き起こすおそれがあります。
TDateTime 値とそれに対応する日時の例を以下の表に示します。
値 | 説明 |
---|---|
0 | 1899 年 12 月 30 日午前 12:00 A.M. |
2.75 | 1900 年 1 月 1 日午後 6:00 P.M. |
-1.25 | 1899 年 12 月 29 日午前 6:00 A.M. |
35065 | 1996 年 1 月 1 日午前 12:00 A.M. |
サンプルコード
TDateTimeの使用方法のサンプルコードです。
// -------------------------------------------
// FormatDateTime, FormatStringを使用した文字列表示
// -------------------------------------------
TDateTime NowTime = Now();
Memo1->Lines->Add( FormatDateTime("yyyy/mm/dd hh:nn:ss ", NowTime) );
Memo1->Lines->Add( NowTime.FormatString("hh:mm:zz AM/PM") );
// -------------------------------------------
// DateToStr, TimeToStr
// -------------------------------------------
Memo1->Lines->Add(DateToStr(NowTime));
Memo1->Lines->Add(TimeToStr(NowTime));
// -------------------------------------------
// System.TDateTime.DayOfWeek
// TDateTime の日付部分の曜日を返します。
// DayOfWeek は 1 から 7 の整数を返します。
// 日曜日(Sunday)が週の最初の日(1)になり,土曜日が 7 番めの日(7)になります。
int dayno = NowTime.DayOfWeek();
Memo1->Lines->Add( (String)"DayOfWeek: " + IntToStr(dayno) );
// -------------------------------------------
// System.TDateTime.DecodeDate
// TDateTime 値を年,月,日の各値に分解し,これらの値を year,month,day のそれぞれのパラメータに入れます。
// TDateTime オブジェクトの日付部分の年(year),月(month),日(day)にアクセスする必要がある場合には,DecodeDate() を使用してください。
// -------------------------------------------
// System.TDateTime.DecodeTime
// TDateTime 値を時,分,秒,ミリ秒の各値に分解し,これらの値を hour,min,sec,msec のそれぞれのパラメータに入れます。
// TDateTime オブジェクトの時刻部分の時,分,秒,ミリ秒にアクセスする必要がある場合には,DecodeTime() を使用してください。
WORD year, month, day;
WORD hour, min, sec, msec;
NowTime.DecodeDate(&year, &month, &day);
NowTime.DecodeTime(&hour, &min, &sec, &msec);
Memo1->Lines->Add((String)"year : " + IntToStr((int)year));
Memo1->Lines->Add((String)"month: " + IntToStr((int)month));
Memo1->Lines->Add((String)"day : " + IntToStr((int)day));
Memo1->Lines->Add((String)"hour : " + IntToStr((int)hour));
Memo1->Lines->Add((String)"min : " + IntToStr((int)min));
Memo1->Lines->Add((String)"sec : " + IntToStr((int)sec));
// -------------------------------------------
// Valプロパティ
// -------------------------------------------
double data = NowTime.Val;
Memo1->Lines->Add(FloatToStr(data));
// -------------------------------------------
// +
// -------------------------------------------
TDateTime wDateTime;
wDateTime = NowTime + 10; // 10日後
Memo1->Lines->Add(DateToStr(wDateTime));
wDateTime = NowTime + 25; // 25日後
Memo1->Lines->Add(DateToStr(wDateTime));
// -------------------------------------------
// -
// -------------------------------------------
wDateTime = NowTime - 10; // 10日前
Memo1->Lines->Add(DateToStr(wDateTime));
wDateTime = NowTime - 25; // 25日前
Memo1->Lines->Add(DateToStr(wDateTime));
日付と時刻のデータ型
日付と時刻を格納するために使われるデータ型を次の表に示します。
型 | 説明 |
---|---|
System.TDate | TDate は、日付を表すために使用されます。 |
System.TDateTime | TDateTime は、Delphi 言語での日付/時刻値を表します。 |
System.SysUtils.TTimeStamp | TTimeStamp は日時の値を表します。 |
System.TTime | TTime は、時間を表すために使用されます。 |
System.DateUtils.TTimeZone | タイム ゾーンをサポートします。 |
現在の日付と時刻の取得
現在の日付と時刻を取得するために使われるすべてのルーチンを次の表に示します。
ルーチン | 説明 |
---|---|
System.SysUtils.CurrentYear | 現在の年を返します。 |
System.SysUtils.Date | 現在の日付を返します。 |
System.SysUtils.DayOfWeek | 指定された日付の曜日を返します。 |
System.SysUtils.GetTime | 現在の時刻を返します。 |
System.SysUtils.Now | 現在の日付と時刻を返します。 |
System.SysUtils.Time | 現在の時刻を返します。 |
System.DateUtils.Today | 現在の日付を表す TDateTime 値を返します。 |
System.DateUtils.Tomorrow | 次の日を表す TDateTime 値を返します。 |
System.DateUtils.Yesterday | 前の日を表す TDateTime 値を返します。 |
日付/時刻値の作成
日付/時刻値を作成するために使われるすべてのルーチンを次の表に示します。
ルーチン | 説明 |
---|---|
System.SysUtils.EncodeDate | 指定された年、月、日を表す TDateTime 値を返します。 |
System.DateUtils.EncodeDateDay | 指定した年の、指定した日(その年の何日目か)を表す TDateTime 値を返します。 |
System.DateUtils.EncodeDateMonthWeek | 指定した年月の、指定した週(その年の何週目か)の、指定した曜日を表す TDateTime 値を返します。 |
System.DateUtils.EncodeDateTime | 指定した年、月、日、時、分、秒、ミリ秒を表す TDateTime 値を返します。 |
System.DateUtils.EncodeDateWeek | 指定した年の、指定した週(その年の何週目か)の、指定した曜日を表す TDateTime 値を返します。 |
System.DateUtils.EncodeDayOfWeekInMonth | 指定した年と月の、指定した回数目の曜日を表す TDateTime 値を返します。 |
System.SysUtils.EncodeTime | 指定した時、分、秒、ミリ秒を表す TDateTime 値を返します。 |
System.SysUtils.TryEncodeDate | 指定した年、月、日を表す TDateTime 値を返します。 |
System.DateUtils.TryEncodeDateDay | 指定した年の、指定した日(その年の何日目か)を表す TDateTime 値を計算します。 |
System.DateUtils.TryEncodeDateMonthWeek | 指定した年月の、指定した週(その年の何週目か)の、指定した曜日を表す TDateTime 値を計算します。 |
System.DateUtils.TryEncodeDateTime | 指定した年、月、日、時、分、秒、ミリ秒を表す TDateTime 値を計算します。 |
System.DateUtils.TryEncodeDateWeek | 指定した年の、指定した週(その年の何週目か)の、指定した曜日を表す TDateTime 値を計算します。 |
System.DateUtils.TryEncodeDayOfWeekInMonth | 指定した年と月の、指定した回数目の曜日を表す TDateTime 値を計算します。 |
System.SysUtils.TryEncodeTime | 指定した時、分、秒、ミリ秒を表す TDateTime 値を計算します。 |
日付/時刻値からの情報の抽出
日付/時刻値から特定の部分を抽出するために使われるすべてのルーチンを次の表に示します。
ルーチン | 説明 |
---|---|
System.DateUtils.DateOf | TDateTime 値から、時刻部分を除去します。 |
System.DateUtils.DayOf | TDateTime 値で表される日付の日部分を返します。 |
System.DateUtils.DayOfTheMonth | TDateTime 値で表される日付の日部分を返します。 |
System.DateUtils.DayOfTheWeek | TDateTimevalue で表される日付の曜日部分を返します。 |
System.DateUtils.DayOfTheYear | 指定した TDateTime 値がその年の何日目かを返します。 |
System.SysUtils.DecodeDate | TDateTime 値で表される年、月、日の各値を返します。 |
System.DateUtils.DecodeDateDay | 指定した TDateTime 値で表される年と日(その年の何日目か)を返します。 |
System.SysUtils.DecodeDateFully | TDateTime 値で表される年、月、日、曜日の各値を返します。 |
System.DateUtils.DecodeDateMonthWeek | 指定した TDateTime で表される年、月、週(その月の何週目か)、曜日を返します。 |
System.DateUtils.DecodeDateTime | 指定された TDateTime 値で表される年、月、日、時、分、秒、ミリ秒の各値を返します。 |
System.DateUtils.DecodeDateWeek | 指定した TDateTime 値で表される年、週(その年の何週目か)、曜日を返します。 |
System.DateUtils.DecodeDayOfWeekInMonth | 指定した TDateTime 値で表される年、月、曜日、その曜日がその月の何回目かを返します。 |
System.SysUtils.DecodeTime | TDateTime 値を時、分、秒、ミリ秒に分解します。 |
System.DateUtils.HourOf | TDateTime 値で表される日付の時間の部分を返します。 |
System.DateUtils.HourOfTheDay | TDateTime 値で表される日付の時間の部分を返します。 |
System.DateUtils.HourOfTheMonth | 指定した TDateTime 値が、その月の最初の日の午前 12:00 から何時間目かを返します。 |
System.DateUtils.HourOfTheWeek | 指定した TDateTime 値が、その週の最初の日の午前 12:00 から何時間目かを返します。 |
System.DateUtils.HourOfTheYear | 指定した TDateTime 値が、その年の最初の日の午前 12:00 から何時間目かを返します。 |
System.DateUtils.MilliSecondOf | TDateTime 値で表される秒のミリ秒を返します。 |
System.DateUtils.MilliSecondOfTheDay | 指定した TDateTime 値が、その日の最初から何ミリ秒目かを返します。 |
System.DateUtils.MilliSecondOfTheHour | 指定した TDateTime 値が、その時間の最初から何ミリ秒目かを返します。 |
System.DateUtils.MilliSecondOfTheMinute | 指定した TDateTime 値が、その分の最初から何ミリ秒目かを返します。 |
System.DateUtils.MilliSecondOfTheMonth | 指定した TDateTime 値が、その月の最初から何ミリ秒目かを返します。 |
System.DateUtils.MilliSecondOfTheSecond | TDateTime 値で表される秒のミリ秒を返します。 |
System.DateUtils.MilliSecondOfTheWeek | 指定した TDateTime 値が、その週の最初の日の午前 12:00:00:00 から何ミリ秒目かを返します。 |
System.DateUtils.MilliSecondOfTheYear | 指定した TDateTime 値が、その年の最初の日の午前 12:00:00:00 から何ミリ秒目かを返します。 |
System.DateUtils.MinuteOf | TDateTime 値で表される時間の分の部分を返します。 |
System.DateUtils.MinuteOfTheDay | 指定した TDateTime 値が、その日の午前 12:00 から何分目かを返します。 |
System.DateUtils.MinuteOfTheHour | 指定した TDateTime 値が、その時間の最初から何分目かを返します。 |
System.DateUtils.MinuteOfTheMonth | 指定した TDateTime 値が、その月の最初の日の午前 12:00 から何分目かを返します。 |
System.DateUtils.MinuteOfTheWeek | 指定した TDateTime 値が、その週の最初の日の午前 12:00 から何分目かを返します。 |
System.DateUtils.MinuteOfTheYear | 指定した TDateTime 値が、その年の最初の日の午前 12:00 から何分目かを返します。 |
System.DateUtils.MonthOf | TDateTime 値で表される年の月の部分を返します。 |
System.DateUtils.MonthOfTheYear | TDateTime 値で表される年の月の部分を返します。 |
System.DateUtils.NthDayOfWeek | 指定された TDateTime 値の曜日を返します。 |
System.DateUtils.SecondOf | TDateTime 値で表される分の秒の部分を返します。 |
System.DateUtils.SecondOfTheDay | 指定した TDateTime 値が、その日の午前 12:00:00 から何秒目かを返します。 |
System.DateUtils.SecondOfTheHour | 指定した TDateTime 値が、その時間の最初から何秒目かを返します。 |
System.DateUtils.SecondOfTheMinute | 指定した TDateTime 値が、その分の最初から何秒目かを返します。 |
System.DateUtils.SecondOfTheMonth | 指定した TDateTime 値が、その月の最初の日の午前 12:00:00 から何秒目かを返します。 |
System.DateUtils.SecondOfTheWeek | 指定した TDateTime 値が、その週の最初の日の午前 12:00:00 から何秒目かを返します。 |
System.DateUtils.SecondOfTheYear | 指定した STDateTime 値が、その年の最初の日の午前 12:00:00 から何秒目かを返します。 |
System.DateUtils.TimeOf | TDateTime 値から日付部分を除去します。 |
System.DateUtils.WeekOf | TDateTime 値で表される年の週の部分を返します。 |
System.DateUtils.WeekOfTheMonth | TDateTime 値で表される月の週の部分を返します。 |
System.DateUtils.WeekOfTheYear | TDateTime 値で表される年の週の部分を返します。 |
System.DateUtils.WeeksInAYear | 指定した年に含まれる週の数を返します。 |
System.DateUtils.WeeksInYear | 指定した TDateTime 値の年に含まれる週の数を返します。 |
System.DateUtils.YearOf | TDateTime 値で表される年を返します。 |
日付/時刻値の比較とチェック
日付/時刻値を比較したりチェックするために使われるすべてのルーチンを次の表に示します。
ルーチン | 説明 |
---|---|
System.DateUtils.CompareDate | 2 つの TDateTime 値の日付部分の関係を示します。 |
System.DateUtils.CompareDateTime | 2 つの TDateTime 値の関係を示します。 |
System.DateUtils.CompareTime | 2 つの TDateTime 値の時間部分の関係を示します。 |
System.DateUtils.IsInLeapYear | 指定した TDateTime 値がうるう年かどうかを示します。 |
System.DateUtils.IsAM | 指定した TDateTime 値の時刻部分が午前かどうかを示します。 |
System.DateUtils.IsPM | 指定した TDateTime 値の時刻部分が午後かどうかを示します。 |
System.DateUtils.IsSameDay | 指定した TDateTime 値が基準日と同じ日かどうかを示します。 |
System.DateUtils.IsToday | 指定した TDateTime 値が現在の日付かどうかを示します。 |
System.DateUtils.IsValidDate | 指定した年、月、日が有効な日付かどうかを示します。 |
System.DateUtils.IsValidDateDay | 指定した年、日(その年の何日目か)が有効な日付かどうかを示します。 |
System.DateUtils.IsValidDateMonthWeek | 指定した年、月、週(その月の何週目か)、曜日が有効な日付かどうかを示します。 |
System.DateUtils.IsValidDateTime | 指定した年、月、日、時、分、秒、ミリ秒が有効な日付と時刻かどうかを示します。 |
System.DateUtils.IsValidDateWeek | 指定した年、週(その年の何週目か)、曜日が有効な日付かどうかを示します。 |
System.DateUtils.IsValidTime | 指定した時、分、秒、ミリ秒が有効な日付と時刻かどうかを示します。 |
System.DateUtils.SameDate | 2 つの TDateTime 値が同じ年、月、日を表すかどうかを示します。 |
System.DateUtils.SameDateTime | 2 つの TDateTime 値が同じ年、月、日、時、分、秒、ミリ秒を表すかどうかを示します。 |
System.DateUtils.SameTime | 2 つの TDateTime 値が同じ時刻を表すかどうかを示します。その際、日付部分は無視します。 |
System.DateUtils.WithinPastDays | 2 つの日付の間隔が、指定した日数の範囲内にあるかどうかを示します。 |
System.DateUtils.WithinPastHours | 2 つの日付/時刻値の間隔が、指定した時間数の範囲内にあるかどうかを示します。 |
System.DateUtils.WithinPastMilliSeconds | 2 つの日付/時刻値の間隔が、指定したミリ秒数の範囲内にあるかどうかを示します。 |
System.DateUtils.WithinPastMinutes | 2 つの日付/時刻値の間隔が、指定した分数の範囲内にあるかどうかを示します。 |
System.DateUtils.WithinPastMonths | 2 つの日付/時刻値の間隔が、指定した月数の範囲内にあるかどうかを示します。 |
System.DateUtils.WithinPastSeconds | 2 つの日付/時刻の間隔が、指定した秒数の範囲内にあるかどうかを示します。 |
System.DateUtils.WithinPastWeeks | 2 つの日付/時刻値の間隔が、指定した週数の範囲内にあるかどうかを示します。 |
System.DateUtils.WithinPastYears | 2 つの日付/時刻値の間隔が、指定した年数の範囲内にあるかどうかを示します。 |
System.DateUtils.DateInRange | TDate 値が所定の範囲内かどうかをチェックします。 |
System.DateUtils.DateTimeInRange | TDateTime 値が所定の範囲内かどうかをチェックします。 |
日付/時刻値の変換
日付/時刻値の変換に使われるすべてのルーチンを次の表に示します。
ルーチン | 説明 |
---|---|
System.DateUtils.DateToISO8601 | TDateTime 形式で指定された日付/時刻値を、ISO 8601 形式に変換します。 |
System.SysUtils.DateTimeToFileDate | TDateTime 値を OS タイムスタンプ値に変換します。 |
System.DateUtils.DateTimeToJulianDate | TDateTime 値をユリウス日に変換します。 |
System.DateUtils.DateTimeToModifiedJulianDate | TDateTime 値を変更したユリウス日に変換します。 |
System.SysUtils.DateTimeToStr | 日付/時刻を表示するローカル設定を使用して、TDateTime 値を文字列に変換します。 |
System.SysUtils.DateTimeToString | 指定された SysUtils.Format 使用して、TDateTime 値を文字列に変換します。 |
System.SysUtils.DateTimeToSystemTime | TDateTime 値を、Win32 API のシステム時刻型に変換します。 |
System.SysUtils.DateTimeToTimeStamp | TDateTime 値を、相当する TTimeStamp 値に変換します。 |
System.DateUtils.DateTimeToUnix | TDateTime 値を、Unix/Linux スタイルの日付/時刻値に変換します。 |
System.SysUtils.DateToStr | TDateTime 値を文字列に変換します。 |
System.DateUtils.ISO8601ToDate | ISO 8691 形式で指定された日付/時刻値を、TDateTime 形式に変換します。 |
System.DateUtils.JulianDateToDateTime | ユリウス日を TDateTime 値に変換します。 |
System.SysUtils.MSecsToTimeStamp | 指定されたミリ秒数を TTimeStamp 値に変換します。 |
System.DateUtils.ModifiedJulianDateToDateTime | 指定されたユリウス日を TDateTime 値に変換します。 |
System.SysUtils.StrToDate | 文字列を TDateTime 値に変換します。 |
System.SysUtils.StrToDateDef | 文字列を TDateTime 値に、エラー デフォルトと共に変換します。 |
System.SysUtils.StrToDateTime | 文字列を TDateTime 値に変換します。 |
System.SysUtils.StrToDateTimeDef | 文字列を TDateTime 値に、エラー デフォルトと共に変換します。 |
System.SysUtils.StrToTime | 文字列を TDateTime 値に変換します。 |
System.SysUtils.StrToTimeDef | 文字列を TDateTime 値に、エラー デフォルトと共に変換します。 |
System.SysUtils.SystemTimeToDateTime | システム時間値を TDateTime 値に変換します。 |
System.SysUtils.TimeStampToDateTime | TTimeStamp 値を、相当する TDateTime 値に変換します。 |
System.SysUtils.TimeStampToMSecs | TTimeStamp 値を、ミリ秒の絶対値に変換します。 |
System.SysUtils.TimeToStr | TDateTime 値を表す文字列を返します。 |
System.SysUtils.TryFloatToDateTime | 浮動小数点値を TDateTime 値に変換します。 |
System.DateUtils.TryJulianDateToDateTime | ユリウス日を TDateTime 値に変換します。 |
System.DateUtils.TryModifiedJulianDateToDateTime | 指定されたユリウス日を TDateTime 値に変換します。 |
System.DateUtils.TryRecodeDateTime | 指定された TDateTime 値を、部分的に選択して置換します。 |
System.SysUtils.TryStrToDate | 文字列を TDateTime 値に、Boolean 成功コードと共に変換します。 |
System.SysUtils.TryStrToDateTime | 文字列を TDateTime 値に、Boolean 成功コードと共に変換します。 |
System.SysUtils.TryStrToTime | 文字列を TDateTime 値に、エラー デフォルトと共に変換します。 |
System.DateUtils.UnixToDateTime | Unix/Linux スタイルの日付/時刻値を、TDateTime 値に変換します。 |
文字列への変換
TDateTime, TDate, TTimeを文字列に変換します。
ルーチン | 説明 |
---|---|
System.SysUtils.DateTimeToStr、System.SysUtils.DateTimeToString、System.SysUtils.FormatDateTime | System.TDateTime 値を文字列に変換します。 |
System.SysUtils.DateToStr | System.TDate 値を文字列に変換します。 |
参考HP
以下、参考となるHPです。