德尔福时间数学计算器
我有一个很不寻常的问题(对我来说)。我正在编写一个应用程序,它允许用户通过显式日期(将我的日期更改为6/3/1955)或使用按钮递增(前进1个月)来向前或向后更改系统时间。德尔福时间数学计算器
我写这篇文章,帮助我的一些用户测试部分,需要这样的跳跃,以模拟一个计费系统的现实世界中使用的软件。
改变德尔福的时间当然是很容易的:
SetDateTime(2008,05,21,16,07,21,00);
但我不知道,如果德尔福(2006)任何内置的helper日期数学,这是我最不喜欢的事情之一:)
任何建议为最好的方式来处理?由于winapi日期时间的呼叫,我宁愿保持原生状态。
谢谢!
VCL的有类型(TDate和TDateTime类型),这是双打,您可以在算术运算使用。
另见EncodeDate和DecodeDate
有大量在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;
这个答案是显著更完整比最高的投票答案。 – 2008-10-07 17:41:30