德尔福时间数学计算器

问题描述:

我有一个很不寻常的问题(对我来说)。我正在编写一个应用程序,它允许用户通过显式日期(将我的日期更改为6/3/1955)或使用按钮递增(前进1个月)来向前或向后更改系统时间。德尔福时间数学计算器

我写这篇文章,帮助我的一些用户测试部分,需要这样的跳跃,以模拟一个计费系统的现实世界中使用的软件。

改变德尔福的时间当然是很容易的:

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

但我不知道,如果德尔福(2006)任何内置的helper日期数学,这是我最不喜欢的事情之一:)

任何建议为最好的方式来处理?由于winapi日期时间的呼叫,我宁愿保持原生状态。

谢谢!

正如贾布尔提到和mliesen,看看在DateUtilsSysUtils单位,有用的功能包括。

  • IncDay - 增加或减去一些天数。
  • IncMonth - 添加或减去几个月。
  • IncWeek - 增加或减去几周。
  • IncYear - 增加或减去若干年。
  • EncodeDate - 从Year,Month和Day参数返回TDateTime值。
+1

这个答案是显著更完整比最高的投票答案。 – 2008-10-07 17:41:30

VCL的有类型(TDate和TDateTime类型),这是双打,您可以在算术运算使用。

另见EncodeDate和DecodeDate

有大量的佣工在DateUtils单元。

有大量在SysUtils单元中助手(和如贾布尔指出,同样在DateUtils)。

如果当月的当天不存在于未来的月份中,您希望发生什么?说,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;