2024/06/03 電子書籍「電子書籍出版・技術文書作成を劇的に加速!秀丸エディタ + Markdown + Pandocの驚異」を出版

C++Builderでの日付および時刻の処理方法

C++Builder

アプリケ-ションを作成する時に、日付や時刻を扱うことは良くありますね。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 は,経過時間(秒単位)を返します。
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 - RAD Studio

2038年問題

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 値とそれに対応する日時の例を以下の表に示します。

説明
01899 年 12 月 30 日午前 12:00 A.M.
2.751900 年 1 月 1 日午後 6:00 P.M.
-1.251899 年 12 月 29 日午前 6:00 A.M.
350651996 年 1 月 1 日午前 12:00 A.M.
System.TDateTime - RAD Studio API Documentation

サンプルコード

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.TDateTDate は、日付を表すために使用されます。
System.TDateTimeTDateTime は、Delphi 言語での日付/時刻値を表します。
System.SysUtils.TTimeStampTTimeStamp は日時の値を表します。
System.TTimeTTime は、時間を表すために使用されます。
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.DateOfTDateTime 値から、時刻部分を除去します。
System.DateUtils.DayOfTDateTime 値で表される日付の日部分を返します。
System.DateUtils.DayOfTheMonthTDateTime 値で表される日付の日部分を返します。
System.DateUtils.DayOfTheWeekTDateTimevalue で表される日付の曜日部分を返します。
System.DateUtils.DayOfTheYear指定した TDateTime 値がその年の何日目かを返します。
System.SysUtils.DecodeDateTDateTime 値で表される年、月、日の各値を返します。
System.DateUtils.DecodeDateDay指定した TDateTime 値で表される年と日(その年の何日目か)を返します。
System.SysUtils.DecodeDateFullyTDateTime 値で表される年、月、日、曜日の各値を返します。
System.DateUtils.DecodeDateMonthWeek指定した TDateTime で表される年、月、週(その月の何週目か)、曜日を返します。
System.DateUtils.DecodeDateTime指定された TDateTime 値で表される年、月、日、時、分、秒、ミリ秒の各値を返します。
System.DateUtils.DecodeDateWeek指定した TDateTime 値で表される年、週(その年の何週目か)、曜日を返します。
System.DateUtils.DecodeDayOfWeekInMonth指定した TDateTime 値で表される年、月、曜日、その曜日がその月の何回目かを返します。
System.SysUtils.DecodeTimeTDateTime 値を時、分、秒、ミリ秒に分解します。
System.DateUtils.HourOfTDateTime 値で表される日付の時間の部分を返します。
System.DateUtils.HourOfTheDayTDateTime 値で表される日付の時間の部分を返します。
System.DateUtils.HourOfTheMonth指定した TDateTime 値が、その月の最初の日の午前 12:00 から何時間目かを返します。
System.DateUtils.HourOfTheWeek指定した TDateTime 値が、その週の最初の日の午前 12:00 から何時間目かを返します。
System.DateUtils.HourOfTheYear指定した TDateTime 値が、その年の最初の日の午前 12:00 から何時間目かを返します。
System.DateUtils.MilliSecondOfTDateTime 値で表される秒のミリ秒を返します。
System.DateUtils.MilliSecondOfTheDay指定した TDateTime 値が、その日の最初から何ミリ秒目かを返します。
System.DateUtils.MilliSecondOfTheHour指定した TDateTime 値が、その時間の最初から何ミリ秒目かを返します。
System.DateUtils.MilliSecondOfTheMinute指定した TDateTime 値が、その分の最初から何ミリ秒目かを返します。
System.DateUtils.MilliSecondOfTheMonth指定した TDateTime 値が、その月の最初から何ミリ秒目かを返します。
System.DateUtils.MilliSecondOfTheSecondTDateTime 値で表される秒のミリ秒を返します。
System.DateUtils.MilliSecondOfTheWeek指定した TDateTime 値が、その週の最初の日の午前 12:00:00:00 から何ミリ秒目かを返します。
System.DateUtils.MilliSecondOfTheYear指定した TDateTime 値が、その年の最初の日の午前 12:00:00:00 から何ミリ秒目かを返します。
System.DateUtils.MinuteOfTDateTime 値で表される時間の分の部分を返します。
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.MonthOfTDateTime 値で表される年の月の部分を返します。
System.DateUtils.MonthOfTheYearTDateTime 値で表される年の月の部分を返します。
System.DateUtils.NthDayOfWeek指定された TDateTime 値の曜日を返します。
System.DateUtils.SecondOfTDateTime 値で表される分の秒の部分を返します。
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.TimeOfTDateTime 値から日付部分を除去します。
System.DateUtils.WeekOfTDateTime 値で表される年の週の部分を返します。
System.DateUtils.WeekOfTheMonthTDateTime 値で表される月の週の部分を返します。
System.DateUtils.WeekOfTheYearTDateTime 値で表される年の週の部分を返します。
System.DateUtils.WeeksInAYear指定した年に含まれる週の数を返します。
System.DateUtils.WeeksInYear指定した TDateTime 値の年に含まれる週の数を返します。
System.DateUtils.YearOfTDateTime 値で表される年を返します。
日付/時刻値からの情報の抽出

日付/時刻値の比較とチェック

日付/時刻値を比較したりチェックするために使われるすべてのルーチンを次の表に示します。

ルーチン説明
System.DateUtils.CompareDate2 つの TDateTime 値の日付部分の関係を示します。
System.DateUtils.CompareDateTime2 つの TDateTime 値の関係を示します。
System.DateUtils.CompareTime2 つの 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.SameDate2 つの TDateTime 値が同じ年、月、日を表すかどうかを示します。
System.DateUtils.SameDateTime2 つの TDateTime 値が同じ年、月、日、時、分、秒、ミリ秒を表すかどうかを示します。
System.DateUtils.SameTime2 つの TDateTime 値が同じ時刻を表すかどうかを示します。その際、日付部分は無視します。
System.DateUtils.WithinPastDays2 つの日付の間隔が、指定した日数の範囲内にあるかどうかを示します。
System.DateUtils.WithinPastHours2 つの日付/時刻値の間隔が、指定した時間数の範囲内にあるかどうかを示します。
System.DateUtils.WithinPastMilliSeconds2 つの日付/時刻値の間隔が、指定したミリ秒数の範囲内にあるかどうかを示します。
System.DateUtils.WithinPastMinutes2 つの日付/時刻値の間隔が、指定した分数の範囲内にあるかどうかを示します。
System.DateUtils.WithinPastMonths2 つの日付/時刻値の間隔が、指定した月数の範囲内にあるかどうかを示します。
System.DateUtils.WithinPastSeconds2 つの日付/時刻の間隔が、指定した秒数の範囲内にあるかどうかを示します。
System.DateUtils.WithinPastWeeks2 つの日付/時刻値の間隔が、指定した週数の範囲内にあるかどうかを示します。
System.DateUtils.WithinPastYears2 つの日付/時刻値の間隔が、指定した年数の範囲内にあるかどうかを示します。
System.DateUtils.DateInRangeTDate 値が所定の範囲内かどうかをチェックします。
System.DateUtils.DateTimeInRangeTDateTime 値が所定の範囲内かどうかをチェックします。
日付/時刻値の比較とチェック

日付/時刻値の変換

日付/時刻値の変換に使われるすべてのルーチンを次の表に示します。

ルーチン説明
System.DateUtils.DateToISO8601TDateTime 形式で指定された日付/時刻値を、ISO 8601 形式に変換します。
System.SysUtils.DateTimeToFileDateTDateTime 値を OS タイムスタンプ値に変換します。
System.DateUtils.DateTimeToJulianDateTDateTime 値をユリウス日に変換します。
System.DateUtils.DateTimeToModifiedJulianDateTDateTime 値を変更したユリウス日に変換します。
System.SysUtils.DateTimeToStr日付/時刻を表示するローカル設定を使用して、TDateTime 値を文字列に変換します。
System.SysUtils.DateTimeToString指定された SysUtils.Format 使用して、TDateTime 値を文字列に変換します。
System.SysUtils.DateTimeToSystemTimeTDateTime 値を、Win32 API のシステム時刻型に変換します。
System.SysUtils.DateTimeToTimeStampTDateTime 値を、相当する TTimeStamp 値に変換します。
System.DateUtils.DateTimeToUnixTDateTime 値を、Unix/Linux スタイルの日付/時刻値に変換します。
System.SysUtils.DateToStrTDateTime 値を文字列に変換します。
System.DateUtils.ISO8601ToDateISO 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.TimeStampToDateTimeTTimeStamp 値を、相当する TDateTime 値に変換します。
System.SysUtils.TimeStampToMSecsTTimeStamp 値を、ミリ秒の絶対値に変換します。
System.SysUtils.TimeToStrTDateTime 値を表す文字列を返します。
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.UnixToDateTimeUnix/Linux スタイルの日付/時刻値を、TDateTime 値に変換します。
日付/時刻値の変換

文字列への変換

TDateTime, TDate, TTimeを文字列に変換します。

ルーチン説明
System.SysUtils.DateTimeToStr、System.SysUtils.DateTimeToString、System.SysUtils.FormatDateTimeSystem.TDateTime 値を文字列に変換します。
System.SysUtils.DateToStrSystem.TDate 値を文字列に変換します。
文字列への変換

参考HP

以下、参考となるHPです。

日付および時刻のサポート - RAD Studio
RAD Studio 12 Athens ヘルプ - RAD Studio
タイトルとURLをコピーしました