如何进行两周周期(第一个星期一是第一天,第二个星期一是第六天)

时间:2014-03-01 16:23:03

标签: delphi date

我如何进行两周的周期。周一至周五......第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

2 个答案:

答案 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