* Bug 16517 fixed: getdate('s') ignored the fractional part 53/21553/5
Samuel GOUGEON [Mon, 27 Jul 2020 03:15:07 +0000 (05:15 +0200)]
  http://bugzilla.scilab.org/16517

Change-Id: I047070bb8181574350950c2a9d061e6984b2cdba

scilab/CHANGES.md
scilab/modules/time/src/c/getdate.c
scilab/modules/time/tests/unit_tests/getdate.dia.ref [deleted file]
scilab/modules/time/tests/unit_tests/getdate.tst

index 0d64427..b27144e 100644 (file)
@@ -319,10 +319,12 @@ Bug Fixes
 * [#16465](https://bugzilla.scilab.org/16465): Scinotes OpenRecent menu was not updated when it should.
 * [#16473](https://bugzilla.scilab.org/16473): Deleting rows in a sparse squared the matrix with padding zeros (Scilab 6 regression).
 * [#16474](https://bugzilla.scilab.org/16474): `imult(%z)` crashed Scilab.
+* [#16517](https://bugzilla.scilab.org/16517): `getdate("s")` truncated the actual time to integer seconds. `getdate(u)(10)` returned fractional seconds instead of milliseconds as `getdate()`.
 * [#16522](https://bugzilla.scilab.org/16522): `bitget(x,pos)` and `bitset(x,pos)` results could be wrong when `pos` is an encoded integer.
 * [#16525](https://bugzilla.scilab.org/16525): `soundsec(t,freq)` has the trivial equivalence `0 : 1/freq : t*(1-%eps)` and should be removed.
 
 
+
 ### Bugs fixed in 6.1.0:
 * [#2694](https://bugzilla.scilab.org/2694): `bitget` did not accept positive integers of types int8, int16 or int32.
 * [#5824](https://bugzilla.scilab.org/5824): The `datafit` algorithm was not documented.
index 99e63c9..61c4165 100644 (file)
@@ -103,17 +103,29 @@ double *getCurrentDateAsDoubleVector(int *iErr)
 double getCurrentDateAsUnixTimeConvention(void)
 {
     double dValue = 0.;
+    double milliseconds = 0.;
 #ifdef _MSC_VER
     /* manages date  up through 23:59:59, December 31, 3000 */
     /* previous version was limited to  19:14:07 January 18, 2038, UTC. */
     struct __timeb64 tstruct;
     _ftime64(&tstruct);
     dValue = (double)tstruct.time;
+
+    milliseconds = (double)(tstruct.millitm);
 #else
     time_t t;
     time(&t);
     dValue = (double)t;
+
+    struct timeval timebuffer;
+    gettimeofday(&timebuffer, NULL);
+    milliseconds = (double)(timebuffer.tv_usec / 1000);  /* micro to ms */
 #endif
+    if (milliseconds < 0)
+    {
+        milliseconds = 0.;
+    }
+    dValue = dValue + milliseconds / 1000;
 
     if (dValue < 0.)
     {
@@ -137,7 +149,7 @@ double * getConvertedDateAsDoubleVector(double dDate, int *iErr)
         time_t instantT = (time_t)dDate;
         tstruct = localtime(&instantT);
 #endif
-        milliseconds = dDate - (double)instantT;
+        milliseconds = (dDate - (double)instantT) * 1000;
         if (milliseconds > 0)
         {
             if (milliseconds > 999)
diff --git a/scilab/modules/time/tests/unit_tests/getdate.dia.ref b/scilab/modules/time/tests/unit_tests/getdate.dia.ref
deleted file mode 100644 (file)
index 0f84ba9..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2007-2008 - INRIA - Pierre MARECHAL <pierre.marechal@inria.fr>
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-// <-- CLI SHELL MODE -->
-// unit tests for getdate function
-// =============================================================================
-dt = getdate(0);
-if dt(1) <> 1970 then bugmes();quit;end
-if dt(2) <> 1 then bugmes();quit;end
-if dt(3) <> 1 then bugmes();quit;end
-if dt(4) <> 1 then bugmes();quit;end
-if dt(5) <> 5 then bugmes();quit;end
-if dt(6) <> 1 then bugmes();quit;end
-if dt(7) <> 1 then bugmes();quit;end
-if dt(8) <> 0 then bugmes();quit;end
-if dt(9) <> 0 then bugmes();quit;end
-if dt(10) <> 0 then bugmes();quit;end
-dt = getdate(1);
-if dt(1) <> 1970 then bugmes();quit;end
-if dt(2) <> 1 then bugmes();quit;end
-if dt(3) <> 1 then bugmes();quit;end
-if dt(4) <> 1 then bugmes();quit;end
-if dt(5) <> 5 then bugmes();quit;end
-if dt(6) <> 1 then bugmes();quit;end
-if dt(7) <> 1 then bugmes();quit;end
-if dt(8) <> 0 then bugmes();quit;end
-if dt(9) <> 1 then bugmes();quit;end
-if dt(10) <> 0 then bugmes();quit;end
-dt = getdate(90542256);
-if dt(1) <> 1972 then bugmes();quit;end
-if dt(2) <> 11 then bugmes();quit;end
-if dt(4) <> 318 then bugmes();quit;end
-if dt(5) <> 2 then bugmes();quit;end
-if dt(6) <> 13 then bugmes();quit;end
-if dt(7) <> 23 then bugmes();quit;end
-if dt(8) <> 37 then bugmes();quit;end
-if dt(9) <> 36 then bugmes();quit;end
-t1_ref = getdate("s");
-t2_ref = datenum();
-t3_ref = getdate();
-t1 = t1_ref;
-t2 = (t2_ref - datenum(1970,1,1,1,0,0)) *3600*24;
-t3 = (datenum(t3_ref(1),t3_ref(2),t3_ref(6),t3_ref(7),t3_ref(8),t3_ref(9)) - datenum(1970,1,1,1,0,0)) * 3600 * 24;
-if ((abs(t2-t1) > 1) & (abs(t2-t1)-3600 > 1))  then bugmes();quit;end
-if ((abs(t3-t1) > 1) & (abs(t3-t1)-3600 > 1))  then bugmes();quit;end
-if ((abs(t3-t2) > 1) & (abs(t3-t2)-3600 > 1))  then bugmes();quit;end
index 1c88043..e839193 100644 (file)
@@ -1,57 +1,72 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2007-2008 - INRIA - Pierre MARECHAL <pierre.marechal@inria.fr>
+// Copyright (C) 2020 - Samuel GOUGEON
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 
 // <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
 
 // unit tests for getdate function
 // =============================================================================
 
+D = getdate();
+// ----------
+assert_checkequal(D, int(D));
+assert_checktrue(D(1) >= 2020);
+assert_checktrue(D(2) > 0 & D(2) < 13);
+assert_checktrue(D(3) > 0 & D(3) < 54);
+assert_checktrue(D(4) > 0 & D(4) < 367);
+assert_checktrue(D(5) > 0 & D(5) < 8);
+assert_checktrue(D(6) > 0 & D(6) < 32);
+assert_checktrue(D(7) >= 0 & D(7) < 25);
+assert_checktrue(D(8) >= 0 & D(8) < 60);
+assert_checktrue(D(9) >= 0 & D(9) < 60);
+assert_checktrue(D(10) >= 0 & D(10) < 1000);
+
+// D = getdate(X)
+// --------------
+D = getdate([1e9, 2e9, 3e9] + 0.21);
+assert_checkequal(size(D), [3, 10]);
+assert_checkalmostequal(D(:,10), [210 210 210]', 1e-3);
+
+assert_checkequal(D(:,1:9), int(D(:,1:9)));
+assert_checktrue(and(D(:,1) >= 2000));
+assert_checktrue(and(D(:,2) > 0 & D(:,2) < 13));
+assert_checktrue(and(D(:,3) > 0 & D(:,3) < 54));
+assert_checktrue(and(D(:,4) > 0 & D(:,4) < 367));
+assert_checktrue(and(D(:,5) > 0 & D(:,5) < 8));
+assert_checktrue(and(D(:,6) > 0 & D(:,6) < 32));
+assert_checktrue(and(D(:,7) >= 0 & D(:,7) < 25));
+assert_checktrue(and(D(:,8) >= 0 & D(:,8) < 60));
+assert_checktrue(and(D(:,9) >= 0 & D(:,9) < 60));
+
+// --------------
+u = getdate("s");
+f = (u - int(u))*1000;
+D = getdate(u);
+assert_checkequal(D(10), f);
+
+// -------------- // Only for time zone = +1h00
 dt = getdate(0);
-if dt(1) <> 1970 then pause,end
-if dt(2) <> 1 then pause,end
-if dt(3) <> 1 then pause,end
-if dt(4) <> 1 then pause,end
-if dt(5) <> 5 then pause,end
-if dt(6) <> 1 then pause,end
-if dt(7) <> 1 then pause,end
-if dt(8) <> 0 then pause,end
-if dt(9) <> 0 then pause,end
-if dt(10) <> 0 then pause,end
+assert_checkequal(dt, [1970 1 1 1 5 1 1 0 0 0]);
 
 dt = getdate(1);
-if dt(1) <> 1970 then pause,end
-if dt(2) <> 1 then pause,end
-if dt(3) <> 1 then pause,end
-if dt(4) <> 1 then pause,end
-if dt(5) <> 5 then pause,end
-if dt(6) <> 1 then pause,end
-if dt(7) <> 1 then pause,end
-if dt(8) <> 0 then pause,end
-if dt(9) <> 1 then pause,end
-if dt(10) <> 0 then pause,end
+assert_checkequal(dt, [1970 1 1 1 5 1 1 0 1 0]);
 
 dt = getdate(90542256);
-if dt(1) <> 1972 then pause,end
-if dt(2) <> 11 then pause,end
-if dt(4) <> 318 then pause,end
-if dt(5) <> 2 then pause,end
-if dt(6) <> 13 then pause,end
-if dt(7) <> 23 then pause,end
-if dt(8) <> 37 then pause,end
-if dt(9) <> 36 then pause,end
+assert_checkequal(dt, [1972 11 46 318 2 13 23 37 36 0]);
 
 t1_ref = getdate("s");
-t2_ref = datenum();
 t3_ref = getdate();
+t2_ref = datenum();
 
-t1 = t1_ref;
+t1 = t1_ref - t3_ref(10)/1000;
 t2 = (t2_ref - datenum(1970,1,1,1,0,0)) *3600*24;
 t3 = (datenum(t3_ref(1),t3_ref(2),t3_ref(6),t3_ref(7),t3_ref(8),t3_ref(9)) - datenum(1970,1,1,1,0,0)) * 3600 * 24;
 
-if ((abs(t2-t1) > 1) & (abs(t2-t1)-3600 > 1))  then pause,end
-if ((abs(t3-t1) > 1) & (abs(t3-t1)-3600 > 1))  then pause,end
-if ((abs(t3-t2) > 1) & (abs(t3-t2)-3600 > 1))  then pause,end
+assert_checkfalse((abs(t2-t1) > 1) & (abs(t2-t1)-3600 > 1));
+assert_checkfalse((abs(t3-t1) > 1) & (abs(t3-t1)-3600 > 1));
+assert_checkfalse((abs(t3-t2) > 1) & (abs(t3-t2)-3600 > 1));