改变今天的日期,推进一个月并设置系统时间

时间:2008-10-07 19:38:45

标签: delphi datetime

我想要一个函数的代码示例,该函数将tDateTime和一个整数作为输入,并在将tDateTime推进(int)个月之后使用setlocaltime设置系统时间。时间应该保持不变。

伪代码示例

SetNewTime(NOW,2);

我遇到的问题令人沮丧。我不能使用incDth或类似的tDateTime,只能使用tDate等。

5 个答案:

答案 0 :(得分:5)

以下是一个适合我的完整命令行程序。在Delphi 5和2007中测试过。为什么你说IncMonth对TDateTime不起作用?

program OneMonth;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows,
  Messages;

procedure SetLocalSystemTime(settotime: TDateTime);
var
  SystemTime : TSystemTime;
begin
  DateTimeToSystemTime(settotime,SystemTime);
  SetLocalTime(SystemTime);
  //tell windows that the time changed
  PostMessage(HWND_BROADCAST,WM_TIMECHANGE,0,0);
end;

begin
  try
    SetLocalSystemTime(IncMonth(Now,1));
  except on E:Exception do
    Writeln(E.Classname, ': ', E.Message);
  end;
end.

答案 1 :(得分:1)

基于您的伪代码:

procedure SetNewTime(aDateTime: TDateTime; aMonths: Integer);
var
  lSystemTime: TSystemTime;
begin
  DateTimeToSystemTime(aDateTime, lSystemTime);
  Inc(lSystemTime.wMonth, aMonths);
  setSystemTime(lSystemTime);
end;

答案 2 :(得分:1)

IncMonth应该使用TDateTime

function IncMonth ( const StartDate  : TDateTime {; NumberOfMonths  : Integer = 1} ) : TDateTime;

请记住,TDate实际上只是一个TDateTime,按照惯例你忽略了分数。

答案 3 :(得分:1)

setSystemTime使用UTC时间,因此您必须根据时区进行调整。偏差是机器时区与UTC不同的分钟数。这会在我的系统上正确调整日期:

procedure SetNewTime(aDateTime: TDateTime; aMonths: Integer);
var
  lSystemTime: TSystemTime;
  lTimeZone: TTimeZoneInformation;
 begin
  GetTimeZoneInformation(lTimeZone);
  aDateTime := aDateTime + (lTimeZone.Bias / 1440);
  DateTimeToSystemTime(aDateTime, lSystemTime);
  Inc(lSystemTime.wMonth, aMonths);
  setSystemTime(lSystemTime);
end;

答案 4 :(得分:0)

没有足够的信息来为您的问题提供明确的答案。

如果您未来一个月中不存在当月的那一天,请考虑您希望发生什么。比如,1月31日+ 1个月。 (一年中的7个月有31天,其余的则少了。)如果你增加年份并且开始日期是闰年的2月29日,你会遇到同样的问题。因此,不可能有一个通用的IncMonth或IncYear函数可以在所有日期一致地工作。

对于任何有兴趣的人,我衷心地推荐Julian Bucknall's article来解决这类计算所固有的复杂性 如何计算两个日期之间的月数和天数。

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

IncDay - 添加或减去天数 IncWeek - 加上或减去一些星期。

但是如果必须使用内置函数,那么至少要确保它们能够按照您的要求执行。看看DateUtils和SysUtils单位。拥有这些函数的源代码是Delphi最酷的方面之一。话虽如此,这里是内置函数的完整列表:

IncDay - 添加或减去天数 IncWeek - 加上或减去一些星期 IncMonth - 添加或减去若干个月 IncYear - 添加或减去若干年。

关于问题的第二部分,如何设置系统日期&使用TDatetime的时间,一旦你有一个具有你想要的价值的TDatetime,来自另一个帖子的以下无耻窃取的代码将完成这项工作:

procedure SetSystemDateTime(aDateTime: TDateTime);
var
  lSystemTime: TSystemTime;
  lTimeZone: TTimeZoneInformation;
 begin
  GetTimeZoneInformation(lTimeZone);
  aDateTime := aDateTime + (lTimeZone.Bias / 1440);
  DateTimeToSystemTime(aDateTime, lSystemTime);
  setSystemTime(lSystemTime);
end;