Browse Source

+ support leap seconds in TryEncodeTime, resolves #40121

(cherry picked from commit a9f9996dc87b2ee7ae1be6cf3cd8d45a939c20b4)
florian 2 years ago
parent
commit
0b85860a1c
2 changed files with 13 additions and 1 deletions
  1. 3 1
      rtl/objpas/sysutils/dati.inc
  2. 10 0
      tests/webtbs/tw40121.pp

+ 3 - 1
rtl/objpas/sysutils/dati.inc

@@ -117,7 +117,9 @@ end;
 function TryEncodeTime(Hour, Min, Sec, MSec:word; Out Time : TDateTime) : boolean;
 
 begin
-  Result:=(Hour<24) and (Min<60) and (Sec<60) and (MSec<1000);
+  Result:=((Hour<24) and (Min<60) and (Sec<60) and (MSec<1000)) or
+    { allow leap second }
+    ((Hour=23) and (Min=59) and (Sec=60) and (MSec<1000));
   If Result then
     Time:=TDateTime(cardinal(Hour)*3600000+cardinal(Min)*60000+cardinal(Sec)*1000+MSec)/MSecsPerDay;
 end;

+ 10 - 0
tests/webtbs/tw40121.pp

@@ -0,0 +1,10 @@
+uses
+  dateutils;
+var
+  dt : TDateTime;
+begin
+  if not(TryISOStrToDateTime('2015-06-30T23:59:60Z',dt)) then
+    halt(1);
+  if not(TryISOStrToDateTime('2016-12-31T23:59:60Z',dt)) then
+    halt(1);
+end.