Математика в Делфи

У меня довольно необычная проблема (для меня). Я пишу приложение, которое позволит пользователю изменять свое системное время вперед или назад либо по явной дате (измените мою дату на 6/3/1955), либо по приращению с помощью кнопок (перейдите вперед на 1 месяц).

Я пишу это, чтобы помочь некоторым моим пользователям протестировать программное обеспечение, которое требует таких прыжков, чтобы имитировать реальное использование биллинговой системы.

изменение времени в Delphi, конечно, очень легко:

SetDateTime(2008,05,21,16,07,21,00);

но я не уверен, что Delphi (2006) имеет встроенные помощники для математики дат, что является одной из моих наименее любимых вещей:)

любые предложения для лучшего способа справиться с этим? Я бы предпочел остаться родным, поскольку вызовы WinAPI datetime сосут.

спасибо!

5 ответов


Как упоминалось габром и млизеном, взгляните на DateUtils и командой sysutils блоки, полезные функции включают.

  • IncDay - добавить или вычесть количество дней.
  • IncMonth - добавить или вычесть количество месяцев.
  • IncWeek - добавить или вычесть несколько недель.
  • IncYear - добавить или вычесть число годы.
  • EncodeDate - возвращает значение TDateTime из параметров Год, месяц и День.

есть много помощников в DateUtils единица.


что вы хотите сделать, если день текущего месяца не существует в вашем будущем месяце? Скажем, 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;

VCL имеет типы (TDate и TDateTime), которые удваиваются, и вы можете использовать в арифметических операциях.

Также см. EncodeDate и DecodeDate


в блоке SysUtils есть много помощников (и, как отметил Габр, также в DateUtils).