2008-10-03 70 views
7

我有一個很不尋常的問題(對我來說)。我正在編寫一個應用程序,它允許用戶通過顯式日期(將我的日期更改爲6/3/1955)或使用按鈕遞增(前進1個月)來向前或向後更改系統時間。德爾福時間數學計算器

我寫這篇文章,幫助我的一些用戶測試部分,需要這樣的跳躍,以模擬一個計費系統的現實世界中使用的軟件。

改變德爾福的時間當然是很容易的:

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

但我不知道,如果德爾福(2006)任何內置的helper日期數學,這是我最不喜歡的事情之一:)

任何建議爲最好的方式來處理?由於winapi日期時間的呼叫,我寧願保持原生狀態。

謝謝!

回答

15

正如賈布爾提到和mliesen,看看在DateUtilsSysUtils單位,有用的功能包括。

  • IncDay - 增加或減去一些天數。
  • IncMonth - 添加或減去幾個月。
  • IncWeek - 增加或減去幾周。
  • IncYear - 增加或減去若干年。
  • EncodeDate - 從Year,Month和Day參數返回TDateTime值。
+1

這個答案是顯著更完整比最高的投票答案。 – 2008-10-07 17:41:30

3

VCL的有類型(TDate和TDateTime類型),這是雙打,您可以在算術運算使用。

另見EncodeDate和DecodeDate

0

有大量在SysUtils單元中助手(和如賈布爾指出,同樣在DateUtils)。

5

如果當月的當天不存在於未來的月份中,您希望發生什麼?說,1月31日+ 1個月?如果您增加年份並且開始日期是閏年的2月29日,則會出現同樣的問題。因此,不可能有一個通用的IncMonth或IncYear函數,它可以在所有日期保持一致。

對於任何感興趣的人,我衷心推薦Julian Bucknall's article關於這類計算固有的複雜性 關於如何計算兩個日期之間的月份和天數。

以下是唯一的通用日期遞增函數可能不引入anomolies到通用日期數學。但它只能通過將責任轉移回程序員來完成這一任務,程序員可能具有他/她編程的特定應用程序的確切要求。

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;