Математика в Делфи
У меня довольно необычная проблема (для меня). Я пишу приложение, которое позволит пользователю изменять свое системное время вперед или назад либо по явной дате (измените мою дату на 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 из параметров Год, месяц и День.
что вы хотите сделать, если день текущего месяца не существует в вашем будущем месяце? Скажем, 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