我现在又写了一段代码,可以算周了,可是算出来的有些不对,具体算法错在哪里,请大家帮我看看
function Tmain.dayweekofyear( Mydate:string):integer;
var
Year, Month, Day: Word;
i,Mydays,weeks:integer;
begin
  Mydays:=0;
  DecodeDate(strtodate(Mydate), Year, Month, Day);
 for  i:=1 to    month-1  do
    begin
       if i=2  then
         begin
         if IsLeapYear(year) then
             Mydays:=Mydays+29;
         if (not IsLeapYear(year)) then
             Mydays:=Mydays+28;
         end;
       if  i mod 2 =0 then
            Mydays:=Mydays+30
       else
            Mydays:=Mydays+31;
    end;
   Mydays:=Mydays+day;
   weeks:=Mydays div 7 +1 ;
  result:=weeks;
end;
然后调用的时候是这样dayweekofyear(datetostr(now))
请问错在哪里

解决方案 »

  1.   

    我知道你的意思了,你是要按星期的整周算。
    但你不应该算月份的天数,周跟月没有关系,应该先算出来本年第一天是周内第几天,然后把上面的日期差加上它减一再除以七加一就行了。var wYear, wMonth, wDay: Word;
    DecodeDate( 日期, wYear, wMonth, wDay );
    第几周 = (日期-EncodeDate( wYear, 1, 1 )+DayOfWeek(日期)-1) div 7 + 1; 
    // 这里假定星期天是每周第一天
      

  2.   

    阿贵
    你的方法我试过了procedure TForm1.FormCreate(Sender: TObject);
    var wYear, wMonth, wDay: Word;
    begin
    DecodeDate(now, wYear, wMonth, wDay );
    (now-EncodeDate( wYear, 1, 1 )+DayOfWeek(now)-1) div 7 + 1;
    end;
    可是编译的时候确报错了呀,这行不对
    (now-EncodeDate( wYear, 1, 1 )+DayOfWeek(now)-1) div 7 + 1;
    错误信息
    为operator not applicable to this operand type
    请问该如何修改
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    var wYear, wMonth, wDay: Word;
         weeks : Integer ;
    begin
    DecodeDate(now, wYear, wMonth, wDay );
    weeks := (trunc (now-EncodeDate( wYear, 1, 1 ))+DayOfWeek(now)-1 ) div 7 + 1;
    showmessage(inttostr(weeks))end;
      

  4.   

    kuangning,你测试一下本年3月1日应该是第九周,可是得到的是第十周
      

  5.   

    007,对不起,仓促之间语句写错,不过算法是没错的。这里是我实际的代码:function WeekOfYear(ADate: TDate): Integer;
    var
      wYear, wMonth, wDay: Word;
      dFirstDay: TDate;
    begin
      DecodeDate( ADate, wYear, wMonth, wDay ); // 先拆分年月日
      dFirstDay := EncodeDate(wYear, 1, 1); // 得到元旦日
      Result := Trunc(ADate-dFirstDay+DayOfWeek(dFirstDay)-1) div 7 + 1;
        // 日期相减为得到本年的第几天,
        // 加上元旦日所在的周内第几天
        // (DayOfWeek结果是1至7,星期天为第1天,所以要减1)(相当于相位补偿),
        // 然后用Trunc取整除以七得到以0开始的周号,加1变成以1开始的周号
    end;