我有一个非常不寻常的问题(对我来说)。我正在编写一个应用程序,允许用户通过明确的日期(将我的日期更改为1955年6月3日)或使用按钮递增(向前1个月)来更改系统时间。
我写这篇文章是为了帮助我的一些用户测试一些软件,这些软件需要像这样的跳转来模拟真实世界中的计费系统使用情况。
在Delphi中更改时间当然很容易:
SetDateTime(2008,05,21,16,07,21,00);
但我不确定Delphi(2006)是否有任何内置的日期数学助手,这是我最不喜欢的东西之一:)
有什么关于处理这个问题的最佳方法的建议吗?我更喜欢保持本地,因为winapi日期时间调用很糟糕。
谢谢!
正如gabr和mliesen所提到的,看看DateUtils和SysUtils单元,有用的函数包括。
- IncDay-添加或减去天数
- IncMonth-加一个月或减去一个月
- IncWeek-添加或减去周数
- IncYear-加一个年份或减去一个年份
- EncodeDate-从年、月和日参数中返回TDateTime值
DateUtils单元中有很多助手。
如果当前月份的日期在您未来的月份中不存在,您希望发生什么?比如说,1月31日+1个月?如果你增加年份,而开始日期是闰年的2月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),它们是双精度的,您可以在算术运算中使用。
另请参阅编码日期和解码日期
SysUtils单元中有很多助手(正如gabr所指出的,DateUtils中也有)。