2014-03-01 133 views
0

如何制作两周的周期。周一至周五... 3天至5天,然后(跳过周末),以下为周一至周五... 6天到第10天如何制作两周周期(星期一是第一天,第二星期一是第六天)

var 
datee : Tdatetime; 
time, date, dateDOW : String; 
dOW : array[1..14] of string; 
Form2: TForm2; 

begin 

    datee := now; 
    date := DateTOStr(now); 
    time := TimeTOStr(now); 
    lbl_date.Caption := DateTOStr(now); 
    lbl_time.Caption := TimeTOStr(now); 
    dow[1] := 'Monday'; 
    dow[2] := 'Tuesday'; 
    dow[3] := 'Wednesday'; 
    dow[4] := 'Thursday'; 
    dow[5] := 'Friday'; 
    dow[6] := 'Saturday'; 
    dow[7] := 'Sunday'; 
    dow[8] := 'Monday'; 
    dow[9] := 'Tuesday'; 
    dow[10] := 'Wednesday'; 
    dow[11] := 'Thursday'; 
    dow[12] := 'Friday'; 
    dow[13] := 'Saturday'; 
    dow[14] := 'Sunday'; 
    datee := encodedate(strToint(edt_date1.text), strtoint(edt_date2.text), strtoint(edt_date3.text)); 
    dateDOW := dow[DayOfWeek(datee - 1)]; 
    lbl_DOW.Caption := dateDOW; 
end; 

我希望它像当它是“3 2014年3月'日= 1,当'10匹配2014'日= 6,然后'2014年3月17日'日= 1.

这些是每个日期必须具有的具体数值。我怎样才能开始这个循环? 的“天”从1..10去(周末不包括在内) 星期五=使用5,星期一= 6

+0

['like this'](http://pastebin.com/U6y3HbY2)? – TLama

+0

的条件,是的。但这只能解决问题,以寻找星期一至星期五。 – GerhardAA

+0

对不起,我不明白你的问题。 – TLama

回答

2

这很难知道什么您正在寻找。 试试这个:

function GerhardiTecDayOfWeek (nDate : tDateTime) : integer; 
const 
    Map : array [ 0 .. 13 ] of integer = (5,5,6,7,8,9,10,10,10,1,2,3,4,5); 
begin 
    Result := Map [ trunc(nDate) mod 14 ]; 
end; 

这里是调用带有不同日期此函数的结果:

   Date  Divide 14  Map 
    Date  as Number Remainder Result 
----------- -----  --   -- 
03-Mar-2014 41701   9   1 
04-Mar-2014 41702  10   2 
05-Mar-2014 41703  11   3 
06-Mar-2014 41704  12   4 
07-Mar-2014 41705  13   5 
08-Mar-2014 41706   0   5 
09-Mar-2014 41707   1   5 
10-Mar-2014 41708   2   6 
11-Mar-2014 41709   3   7 
12-Mar-2014 41710   4   8 
13-Mar-2014 41711   5   9 
14-Mar-2014 41712   6   10 
15-Mar-2014 41713   7   10 
16-Mar-2014 41714   8   10 
17-Mar-2014 41715   9   1 
18-Mar-2014 41716  10   2 
19-Mar-2014 41717  11   3 
20-Mar-2014 41718  12   4 
21-Mar-2014 41719  13   5 
22-Mar-2014 41720   0   5 
23-Mar-2014 41721   1   5 
24-Mar-2014 41722   2   6 
25-Mar-2014 41723   3   7 
26-Mar-2014 41724   4   8 
27-Mar-2014 41725   5   9 
28-Mar-2014 41726   6   10 
29-Mar-2014 41727   7   10 
30-Mar-2014 41728   8   10 
31-Mar-2014 41729   9   1 
01-Apr-2014 41730  10   2 

日期被简单地存储为浮点数。整数部分是固定日期的天数。 (1899年12月30日)小数部分是一天的时间。这里我们只是使用日期,我们可以忽略时间部分。调用trunc将该值转换为整数类型。 Mod 14表示除以14并保留余数。所以你得到一个从零到13的数字。你说2014年3月3日应该是第一天。这个日期被表示为40701.除以14并且得到9的余数。因此,我们将Map [9]的值设置为1.之后的那天是2.之后的那一天是3.然后4和现在我们环顾四周。星期六,2014年3月8日是41706号。除以14,余数为零。所以我们将Map [0]设置为星期六的值。我假设你想在周六和周日返回5。下一个星期一,2014年3月10日是41708.除以14,余数为2.所以我们将Map [2]设置为6.下一个星期二是Map [3],所以这是7,依此类推。最后,您将于2014年3月17日星期一抵达。这是41715除以14,提醒9,而我们已经回到开始,Map [9]设置为1。

请注意,正如所写,该例程将仅适用于1899年12月30日之后的日期。如果您需要处理日期,那么MOD将返回负值。如果需要,可以修改例程以处理这些日期。

+0

我不知道这是如何工作的!但它确实!谢谢你:)你能解释给我吗? – GerhardAA

+0

我已经添加了一个解释。 –

1

如果你的周期总是始于星期一:

var 
    FirstDay, DayDate: TDateTime; 
    AWeek, ADay, DayNum: Integer; 
begin 
    FirstDay := StartOfTheWeek(Now); 
    for AWeek := 0 to 1 do 
    for ADay := 1 to 5 do begin 
     DayNum := AWeek * 5 + ADay; 
     DayDate := FirstDay + AWeek * 7 + ADay; 
     Memo1.Lines.Add(IntToStr(DayNum) + ': ' + DateToStr(DayDate)); 
    end; 


1: 25.02.2014 
2: 26.02.2014 
3: 27.02.2014 
4: 28.02.2014 
5: 01.03.2014 
6: 04.03.2014 
7: 05.03.2014 
8: 06.03.2014 
9: 07.03.2014 
10: 08.03.2014 
+0

你能解释我如何解释这个日期?一个起点(2014年3月3日----日= 1)。如果我输入任何日期(不是周末日期),如果将给我一天=▲。 – GerhardAA

+0

@GerhardiTec I扩展示例 – MBo

+0

“FirstDay:= StartOfTheWeek(Now);”起步周是无法识别的。我可以用什么替换它? – GerhardAA

相关问题