Browse Source

* fixed formatdatetime('c',...)
* fixed strtodate
* dateencode/decode is now delphi compatible

peter 26 years ago
parent
commit
edd62da064
1 changed files with 95 additions and 53 deletions
  1. 95 53
      rtl/objpas/dati.inc

+ 95 - 53
rtl/objpas/dati.inc

@@ -44,7 +44,7 @@ if (Month > 0) and (Month < 13) and (Day > 0) and (Day < 32) then
      c:= Year DIV 100;
      ya:= Year - 100*c;
      result := (146097*c) SHR 2 + (1461*ya) SHR 2 + (153*Month+2) DIV 5 + Day -
-693901;
+693900;
    end else result:=0;
 end;
 
@@ -87,7 +87,7 @@ end ;
 function MSecsToTimeStamp(MSecs: comp): TTimeStamp;
 begin
   result.Date := trunc(msecs / msecsperday);
-  msecs:= msecs - comp(result.date * msecsperday);
+  msecs:= msecs - comp(result.date) * comp(msecsperday);
   result.Time := Trunc(MSecs);
 end ;
 
@@ -121,7 +121,7 @@ procedure DecodeDate(Date: TDateTime; var Year, Month, Day: word);
 var
   j : cardinal;
 begin
-  j := pred((Trunc(System.Int(Date)) + 693901) SHL 2);
+  j := pred((Trunc(System.Int(Date)) + 693900) SHL 2);
   Year:= j DIV 146097;
   j:= j - 146097 * Year;
   Day := j SHR 2;
@@ -282,68 +282,97 @@ var
    c:word;
    dp,mp,yp,which : Byte;
    s1:string[4];
-   values:array[0..2] of longint;
+   values:array[1..3] of longint;
    LocalTime:tsystemtime;
 
 begin
-df := UpperCase(ShortDateFormat);
-{ Determine order of D,M,Y }
-Which:=0;
-For I:=1 to Length(df) do
-  Case df[i] of
-    'Y' : yp:=which;
-    'M' : mp:=which;
-    'D' : dp:=which;
-  else
-    If df[i]=DateSeparator then
-     Inc(Which);
-  end;
+  df := UpperCase(ShortDateFormat);
+  { Determine order of D,M,Y }
+  yp:=0;
+  mp:=0;
+  dp:=0;
+  Which:=0;
+  i:=0;
+  while (i<Length(df)) and (Which<3) do
+   begin
+     inc(i);
+     Case df[i] of
+       'Y' :
+         if yp=0 then
+          begin
+            Inc(Which);
+            yp:=which;
+          end;
+       'M' :
+         if mp=0 then
+          begin
+            Inc(Which);
+            mp:=which;
+          end;
+       'D' :
+         if dp=0 then
+          begin
+            Inc(Which);
+            dp:=which;
+          end;
+     end;
+   end;
+  if Which<>3 then
+   Raise EConvertError.Create('Illegal format string');
 { Get actual values }
-for i := 0 to 2 do values[i] := 0;
-s1 := '';
-n := 0;
-for i := 1 to length(s) do begin
-   if (s[i] in ['0'..'9']) then s1 := s1 + s[i];
-   if (s[i] in [dateseparator,' ']) or (i = length(s)) then begin
-      val(s1, values[n], c);
-      if c<>0 then
-        Raise EConvertError.Create('Invalid date format');
-      s1 := '';
-      inc(n);
+  for i := 1 to 3 do
+    values[i] := 0;
+  s1 := '';
+  n := 0;
+  for i := 1 to length(s) do
+   begin
+     if (s[i] in ['0'..'9']) then
+      s1 := s1 + s[i];
+     if (s[i] in [dateseparator,' ']) or (i = length(s)) then
+      begin
+        inc(n);
+        if n>3 then
+         Raise EConvertError.Create('Invalid date format');
+        val(s1, values[n], c);
+        if c<>0 then
+         Raise EConvertError.Create('Invalid date format');
+        s1 := '';
       end ;
    end ;
-// Fill in values.
-If N=3 then
-  begin
-  y:=values[yp];
-  m:=values[mp];
-  d:=values[dp];
-  end
-Else
+  // Fill in values.
+  If N=3 then
+   begin
+     y:=values[yp];
+     m:=values[mp];
+     d:=values[dp];
+   end
+  Else
   begin
-  getLocalTime(LocalTime);
-  y := LocalTime.Year;
-  If n<2 then
-    begin
-    d:=values[0];
-    m := LocalTime.Month;
-    end
-  else
-    If dp<mp then
+    getLocalTime(LocalTime);
+    y := LocalTime.Year;
+    If n<2 then
+     begin
+       d:=values[1];
+       m := LocalTime.Month;
+     end
+    else
+     If dp<mp then
       begin
-      d:=values[0];
-      m:=values[1];
+        d:=values[1];
+        m:=values[2];
       end
     else
       begin
-      d:=values[1];
-      m:=values[0];
+        d:=values[2];
+        m:=values[1];
       end;
   end;
-if (y >= 0) and (y < 100) then y := 1900 + y;
-Result := DoEncodeDate(y, m, d);
+  if (y >= 0) and (y < 100) then
+   inc(y,1900);
+  Result := DoEncodeDate(y, m, d);
 end ;
 
+
 {   StrToTime converts the string S to a TDateTime value
     if S does not represent a valid time value an
     EConvertError will be raised   }
@@ -584,11 +613,19 @@ var
                         if Count = 1 then StoreFormat(timereformat(ShortTimeFormat))
                         else StoreFormat(TimeReformat(LongTimeFormat));
                         end ;
-                     'C': StoreFormat(ShortDateFormat + ' ' + TimeReformat(ShortTimeFormat));
+                     'C':
+                       begin
+                         StoreFormat(ShortDateFormat);
+                         if (Hour<>0) or (Minute<>0) or (Second<>0) then
+                          begin
+                            StoreString(' ');
+                            StoreFormat(TimeReformat(ShortTimeFormat));
+                          end;
+                       end;
                   end ;
                end ;
             else
-              Raise EConvertError.Create('Illegal character in format string');
+              StoreStr(@Token, 1);
          end ;
       FormatCurrent := FormatCurrent + Count;
       end ;
@@ -643,7 +680,12 @@ end;
 
 {
   $Log$
-  Revision 1.15  1999-07-24 11:21:14  peter
+  Revision 1.16  1999-08-11 21:53:04  peter
+    * fixed formatdatetime('c',...)
+    * fixed strtodate
+    * dateencode/decode is now delphi compatible
+
+  Revision 1.15  1999/07/24 11:21:14  peter
     * fixed encode/decode date/time
 
   Revision 1.14  1999/07/14 08:47:54  michael