我如何进行两周的周期。周一至周五......第1天至第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;
我希望它就像'2014年3月3日'那天= 1.当'10匹配2014'那天= 6.然后'2014年3月17日'那天= 1。
这些是每个日期必须具备的具体值。我该如何开始循环? 'day'从1..10开始(周末不包括在内) 星期五= 5,星期一= 6
答案 0 :(得分: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
日期只是存储为浮点数。整数部分是固定日期之后的天数。 (18-Dec-1899)小数部分是一天中的时间。这里我们只是使用日期,我们可以忽略时间部分。调用trunc
会将值转换为整数类型。 Mod 14
表示除以14并保留其余部分。所以你得到一个从零到13的数字。你说2014年3月3日应该是第1天。该日期表示为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
之前处理日期,则会返回负值。如有必要,可以修改例程以使用这些日期。
答案 1 :(得分: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