Время математика в Дельфи - PullRequest
7 голосов
/ 03 октября 2008

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

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

Изменение времени в Дельфах, конечно, очень просто:

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

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

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

Спасибо!

Ответы [ 5 ]

15 голосов
/ 05 октября 2008

Как уже упоминали Габр и Млисен, взгляните на DateUtils и SysUtils , полезные функции включают в себя.

  • IncDay - Добавить или вычесть количество дней.
  • IncMonth - Добавить или вычесть количество месяцев.
  • IncWeek - Добавить или вычесть количество недель.
  • IncYear - Добавить или вычесть количество лет.
  • EncodeDate - Возвращает значение TDateTime из параметров Year, Month и Day.
9 голосов
/ 03 октября 2008

В блоке DateUtils есть множество помощников.

5 голосов
/ 10 октября 2008

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

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

Также см. EncodeDate и DecodeDate

0 голосов
/ 04 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...