現在の月の日が将来の月に存在しない場合、どうしたいですか? たとえば、1 月 31 日 + 1 か月ですか。年をインクリメントし、開始日がうるう年の 2 月 29 日である場合も、同じ問題が発生します。したがって、すべての日付で一貫して機能する普遍的な IncMonth または IncYear 関数は存在しません。
興味のある方には、2 つの日付間の月数と日数を計算する方法に関する、この種の計算に内在する複雑さに関するJulian Bucknall の記事を心からお勧めします。
以下は、一般的な日付計算に異常を導入しない唯一の可能な一般的な日付インクリメント関数です。しかし、これを達成するには、おそらく自分がプログラミングしている特定のアプリケーションの正確な要件を持っていると思われるプログラマーに責任を移すだけです。
IncDay - 日数を加算または減算します。
IncWeek - 週数を加算または減算します。
ただし、組み込み関数を使用する必要がある場合は、少なくとも、それらが目的どおりに機能することを確認してください。DateUtils および SysUtils ユニットを見てください。これらの関数のソース コードがあることは、Delphi の最も優れた点の 1 つです。そうは言っても、組み込み関数の完全なリストは次のとおりです。
IncDay - 日数を加算または減算します。
IncWeek - 週数を加算または減算します。
IncMonth - 月数を加算または減算します。
IncYear - 年数を加算または減算します。
質問の 2 番目の部分である、TDatetime を使用してシステムの日付と時刻を設定する方法については、別の投稿から恥知らずに盗まれた次のコードが機能します。
procedure SetSystemDateTime(aDateTime: TDateTime);
var
lSystemTime: TSystemTime;
lTimeZone: TTimeZoneInformation;
begin
GetTimeZoneInformation(lTimeZone);
aDateTime := aDateTime + (lTimeZone.Bias / 1440);
DateTimeToSystemTime(aDateTime, lSystemTime);
setSystemTime(lSystemTime);
end;