7

我有一个非常不寻常的问题(对我来说)。我正在编写一个应用程序,它允许用户通过明确的日期(将我的日期更改为 1955 年 6 月 3 日)或使用按钮递增(前进 1 个月)来向前或向后更改他们的系统时间。

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

在 Delphi 中更改时间当然非常简单:

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

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

对于处理这个问题的最佳方法有什么建议吗?我宁愿保持原生,因为 winapi 日期时间调用很糟糕。

谢谢!

4

5 回答 5

15

正如 gabr 和 mliesen 所提到的,看看 DateUtils 和 SysUtils单元有用的功能包括。

  • IncDay - 添加或减去天数。
  • IncMonth - 加或减月数。
  • IncWeek - 增加或减少周数。
  • IncYear - 添加或减去若干年。
  • EncodeDate - 从年、月和日参数返回 TDateTime 值。
于 2008-10-05T19:02:24.980 回答
9

DateUtils单元中有很多助手。

于 2008-10-03T18:12:15.050 回答
5

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

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

以下是唯一可能不会将异常引入通用日期数学的通用日期增量函数。但它只能通过将责任转回给可能具有他/她正在编程的特定应用程序的确切要求的程序员来实现这一点。

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-10T07:40:14.027 回答
3

VCL 具有双精度类型(TDate 和 TDateTime),您可以在算术运算中使用。

另请参阅 EncodeDate 和 DecodeDate

于 2008-10-03T18:05:51.647 回答
0

SysUtils 单元中有很多助手(正如 gabr 所指出的,在 DateUtils 中也是如此)。

于 2008-10-03T21:38:04.573 回答