summaryrefslogtreecommitdiff
path: root/modules/time/macros/etime.sci
diff options
context:
space:
mode:
Diffstat (limited to 'modules/time/macros/etime.sci')
-rwxr-xr-xmodules/time/macros/etime.sci91
1 files changed, 91 insertions, 0 deletions
diff --git a/modules/time/macros/etime.sci b/modules/time/macros/etime.sci
new file mode 100755
index 000000000..f2493f4f3
--- /dev/null
+++ b/modules/time/macros/etime.sci
@@ -0,0 +1,91 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) INRIA - Vincent Couvert
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution. The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+
+function t=etime(t1,t0)
+
+ // returns the time in seconds that has elapsed between vectors t1 and t0
+ // t1 and t0 must be six elements long, in the format:
+ // t = [Year Month Day Hour Minute Second.Milliseconds]
+ // or, 10 elements long, in the format returned by getdate()
+ // t = [Year Month ISO_8601_week_number Julian_day Week_Day Day Hour Minute Second Millisecond]
+ // in this case ISO_8601_week_number Julian_day Week_Day are ignored
+ // t1 and t0 can also be matrices having each line equal to a vector described above
+
+
+ if type(t1)<>1 then
+ error(msprintf(gettext("%s: Wrong type for input argument #%d: Real vector expected.\n"),"etime",1));
+ end
+ if type(t0)<>1 then
+ error(msprintf(gettext("%s: Wrong type for input argument #%d: Real vector expected.\n"),"etime",2));
+ end
+ if and(size(t1,2)<>[6,10]) then
+ error(msprintf(gettext("%s: Wrong size for input argument #%d: Must be between %d and %d.\n"),"etime",1,6,10));
+ end
+ if and(size(t0,2)<>[6,10]) then
+ error(msprintf(gettext("%s: Wrong size for input argument #%d: Must be between %d and %d.\n"),"etime",2,6,10));
+ end
+
+ if size(t1,"*")<>size(t0,"*") then
+ error(msprintf(gettext("%s: Wrong size for input arguments #%d and #%d: Same size expected.\n"),"etime"), 1, 2);
+ end
+
+ if size(t1,2)==10 then
+ t1(:,3:5)=[]
+ end
+ if size(t0,2)==10 then
+ t0(:,3:5)=[]
+ end
+
+ // Cumulative days per month in a nonleap year
+ cdm = [0,31,59,90,120,151,181,212,243,273,304,334]
+
+ t=0
+
+ for k=1:2
+ if k==1 then
+ tcur=t1
+ else
+ tcur=t0
+ end
+
+ Year=tcur(:,1)
+ Month=tcur(:,2)
+ Day=tcur(:,3)
+
+ // Make sure month is in the range 1 to 12
+ Month(Month<1)=1
+ for kM=1:size(Month,"*")
+ if Month(kM) > 12 then
+ Year(kM) = Year(kM) + (Month(kM)-1)/12;
+ Month(kM) = fix((Month(kM)-1) / 12) + 1;
+ end
+ CDM=cdm(Month(kM))
+ end
+
+ tsec = 365.*Year + ceil(Year/4) - ceil(Year/100) + ceil(Year/400) + CDM + Day;
+
+ for kM=1:size(Month,"*")
+ if Month > 2 then
+ iy=fix(Year)
+ if fix(iy/4).*4 == iy & fix(iy/100).*100 <> iy | fix(iy/400).*400 == iy then
+ tsec = tsec+1;
+ end
+ end
+ end
+ if k==1 then
+ t=tsec
+ else
+ t=t-tsec
+ end
+ end
+ t=86400*t+t1(:,4)*3600-t0(:,4)*3600+t1(:,5)*60-t0(:,5)*60+t1(:,6)-t0(:,6)
+ if size(t1,2)==7 then
+ t=t+(t1(:,7)-t0(:,7))*1e-3
+ end
+endfunction