2012-01-13 84 views
8

使用Delphi,我需要一个函数来评估当前日期,并查看它是否是例如本月的第三个星期天等。本月的第一个[星期一],本月的第二个[星期四]等。德尔福

伪代码:

function IsFirst(const CurrentDateTime: TDateTime; const Day: Word): Boolean; 
/// Day can be 1-7 (monday to sunday) 
begin 
    Result:= ?? 
end; 

将需要另一个函数来计算二,三,四月份的最后和。 DateUtils似乎没有那样的东西。有任何想法吗?

+1

你到目前为止尝试过什么? – 2012-01-13 08:27:52

+0

您的功能没有结果类型,您的意图不清楚从代码或您的问题的文本。 – 2012-01-13 09:02:20

回答

13

此功能是你所需要的:

function IsFirst(const DateTime: TDateTime; const Day: Word): Boolean; 
begin 
    Result := (DayOfTheWeek(DateTime)=Day) and 
    InRange(DayOfTheMonth(DateTime), 1, 7); 
end; 

为第二次出现的等效功能是:

function IsSecond(const DateTime: TDateTime; const Day: Word): Boolean; 
begin 
    Result := (DayOfTheWeek(DateTime)=Day) and 
    InRange(DayOfTheMonth(DateTime), 8, 14); 
end; 

我敢肯定,你可以填写详细信息第三,第四和第五。你可能更喜欢写这样一个单一的一般功能:

function IsNth(const DateTime: TDateTime; const Day: Word; 
    const N: Integer): Boolean; 
var 
    FirstDayOfWeek, LastDayOfWeek: Integer; 
begin 
    LastDayOfWeek := N*7; 
    FirstDayOfWeek = LastDayOfWeek-6; 
    Result := (DayOfTheWeek(DateTime)=Day) and 
    InRange(DayOfTheMonth(DateTime), FirstDayOfWeek, LastDayOfWeek); 
end; 
4

这可以使用简单的数学来完成。

获取DayOfTheWeek并将DayOf除以7。

+0

是的,他可能是指'mod'。 – 2012-01-13 13:22:17

+0

我的意思是'DayOf'应该给出与'DayOfTheMonth'相同的结果,我应该把它分成两个句子。关键是你可以用简单的数学来做到这一点。戴维斯的回答很好。 – 2012-01-13 14:44:14

+0

@DavidHeffernan - 我没有指出答案,只是“除以”部分。看到“DateTime”Perl模块的内部结构后,我怯懦地拒绝编写与日期计算相关的任何内容。 – 2012-01-13 15:23:49

相关问题