[Back to DATETIME SWAG index] [Back to Main SWAG index] [Original]

    {
     "Does anyone have a decent routine for converting a
     date to and from the number of days since 1/1/1970,
     which properly takes into account leap years?"

    While you can use Julian math, I use/wrote the following-
    (Note: An integer can hold up to a little over 89 years,
    or a word can hold upto 65536 days or about 179 years)
    }

    function leapyear (c,y : byte) : boolean;
      begin
        if (y and 3) <> 0
        then leapyear := false
        else if y=0
             then leapyear := (c and 3)=0
             else leapyear := true;
      end;

    function DaysInMonth (c,y,m : byte) : integer;
      begin
        if m=2
        then if leapyear(c,y)
             then DaysInMonth := 29
             else DaysInMonth := 28
        else DaysInMonth := 30 + (($15AA shr m) and 1);
      end;

    function DaysInYear (c,y : byte) : integer;
      begin
        DaysInYear := DaysInMonth(c,y,2)+337;
      end;

    Function DayOfYear (c,y,m,d :byte) : integer;
      var i,j : integer;
      begin
        j := d;
          for i := 1 to pred(m) do j := j + DaysInMonth(c,y,i);
        DayOfYear := j;
      end;

    So for date2-date1
       x := DaysInYear(date1) - DatOfYear(Date1);
       for i := succ(date1) to pred(date2) do
         x := x + DaysInYear(i);
       x := x + DayOfYear(date2);

[Back to DATETIME SWAG index] [Back to Main SWAG index] [Original]