Что вы хотите, чтобы произошло, если день текущего месяца не существует в вашем будущем месяце? Скажите, 31 января + 1 месяц? У вас та же проблема, если вы увеличиваете год, а начальная дата - 29 февраля високосного года. Поэтому не может быть универсальной функции IncMonth или IncYear, которая бы работала согласованно во все даты.
Для всех, кого я заинтересован, я искренне рекомендую статью Джулиана Бакнолла о сложностях, присущих этому типу расчета.
о том, как рассчитать количество месяцев и дней между двумя датами.
Ниже приведены единственные возможные функции приращения даты, которые не вводят аномалии в общую математику даты. Но это достигается только путем переноса ответственности обратно на программиста, который предположительно имеет точные требования к конкретному приложению, которое он / она программирует.
IncDay - Добавить или вычесть количество дней.
IncWeek - Добавить или вычесть количество недель.
Но если вы должны использовать встроенные функции, по крайней мере, убедитесь, что они делают то, что вы от них хотите. Посмотрите на модули DateUtils и SysUtils. Наличие исходного кода для этих функций является одним из самых крутых аспектов Delphi. Сказав это, вот полный список встроенных функций:
IncDay - добавление или вычитание количества дней.
IncWeek - Добавить или вычесть количество недель.
IncMonth - Добавить или вычесть количество месяцев.
IncYear - Добавить или вычесть количество лет.
Что касается второй части вашего вопроса, как установить системную дату и время, используя TDatetime, то следующий постыдно украденный код из другого поста сделает эту работу:
procedure SetSystemDateTime(aDateTime: TDateTime);
var
lSystemTime: TSystemTime;
lTimeZone: TTimeZoneInformation;
begin
GetTimeZoneInformation(lTimeZone);
aDateTime := aDateTime + (lTimeZone.Bias / 1440);
DateTimeToSystemTime(aDateTime, lSystemTime);
setSystemTime(lSystemTime);
end;