德尔福的时间数学

Bru*_*oon 7 delphi time date

我有一个非常不寻常的问题(对我而言).我正在编写一个应用程序,允许用户通过明确的日期(将我的日期更改为6/3/1955)或使用按钮增加(前进1个月)来更改系统时间.

我写这篇文章是为了帮助我的一些用户测试一些需要跳转的软件,以便模拟计费系统的实际使用情况.

改变Delphi的时间当然很简单:

SetDateTime(2008,05,21,16,07,21,00);
Run Code Online (Sandbox Code Playgroud)

但我不确定Delphi(2006)是否有日期数学的内置助手,这是我最不喜欢的事情之一:)

有关处理此问题的最佳方法的任何建议吗?因为winapi datetime调用suck,我宁愿保持原生.

谢谢!

stu*_*lly 15

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

  • IncDay - 添加或减去天数.
  • IncMonth - 添加或减去几个月.
  • IncWeek - 添加或减去数周.
  • IncYear - 添加或减去若干年.
  • EncodeDate - 从年,月和日参数返回TDateTime值.


gab*_*abr 9

DateUtils单元中有很多帮助程序.


use*_*293 5

如果您未来一个月中不存在当月的那一天,您希望发生什么?比如,1月31日+ 1个月?如果您增加年份并且开始日期是闰年的2月29日,则会出现同样的问题.因此,不可能有一个通用的IncMonth或IncYear函数可以在所有日期一致地工作.

对于任何有兴趣的人,我衷心地推荐Julian Bucknall关于如何计算两个日期之间的月数和天数的此类计算所固有的复杂性的文章.

以下是唯一可能的通用日期增量函数,它们不会将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;
Run Code Online (Sandbox Code Playgroud)