summaryrefslogtreecommitdiff
path: root/modules/time/macros/datenum.sci
diff options
context:
space:
mode:
Diffstat (limited to 'modules/time/macros/datenum.sci')
-rwxr-xr-xmodules/time/macros/datenum.sci192
1 files changed, 192 insertions, 0 deletions
diff --git a/modules/time/macros/datenum.sci b/modules/time/macros/datenum.sci
new file mode 100755
index 000000000..8aaa7b3b5
--- /dev/null
+++ b/modules/time/macros/datenum.sci
@@ -0,0 +1,192 @@
+//------------------------------------------------------------------------
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) INRIA - Pierre MARECHAL
+//
+// 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
+
+//
+// Convert to serial date number
+//------------------------------------------------------------------------
+
+function n=datenum(varargin)
+
+ lhs=argn(1);
+ rhs=argn(2);
+
+ select rhs
+ case 0
+ Date = getdate();
+
+ n = ymdhmns_to_scalar(Date(1),..
+ Date(2),..
+ Date(6),..
+ Date(7),..
+ Date(8),..
+ Date(9));
+
+ break
+
+ case 1
+
+ DateIn = varargin(1);
+
+ // Checks
+
+ if type(DateIn)<> 1 then
+ error(msprintf(gettext("%s: Wrong type for input argument #%d: Real matrix expected.\n"),"datenum",1));
+ end
+
+ [nr,nc] = size(DateIn);
+
+ if (nc <> 3) & (nc <> 6) then
+ error(msprintf(gettext("%s: Wrong size for input argument #%d: m*3 matrix or a m*6 matrix expected.\n"),"datenum",1));
+ end
+
+ if min(DateIn(:,2))<1 | max(DateIn(:,2))>12 then
+ error(msprintf(gettext("%s: Wrong value for input argument #%d: %s must be between %d and %d.\n"),"datenum",1,gettext("Month"),1,12));
+ end
+
+ if min(DateIn(:,3))<1 | max(DateIn(:,3))>31 then
+ error(msprintf(gettext("%s: Wrong value for input argument #%d: %s must be between %d and %d.\n"),"datenum",1,gettext("Day"),1,31));
+ end
+
+ if nc == 6 then
+
+ if min(DateIn(:,4))<0 | max(DateIn(:,4))>23 then
+ error(msprintf(gettext("%s: Wrong value for input argument #%d: %s must be between %d and %d.\n"),"datenum",1,gettext("Hour"),0,23));
+ end
+
+ if min(DateIn(:,5))<0 | max(DateIn(:,5))>59 then
+ error(msprintf(gettext("%s: Wrong value for input argument #%d: %s must be between %d and %d.\n"),"datenum",1,gettext("Minute"),0,59));
+ end
+
+ if min(DateIn(:,6))<0 | max(DateIn(:,6))>=60 then
+ error(msprintf(gettext("%s: Wrong value for input argument #%d: %s must be between %d and %d.\n"),"datenum",1,gettext("Second"),0,59));
+ end
+
+ end
+
+ if nc == 3 then
+ n = ymdhmns_to_scalar(DateIn(:,1),DateIn(:,2),DateIn(:,3),zeros(nr),zeros(nr),zeros(nr));
+ else
+ n = ymdhmns_to_scalar(DateIn(:,1),DateIn(:,2),DateIn(:,3),DateIn(:,4),DateIn(:,5),DateIn(:,6));
+ end
+ break
+
+ case 3
+
+ YearIn = varargin(1);
+ MonthIn = varargin(2);
+ DayIn = varargin(3);
+
+ // checks
+
+ if (type(YearIn)<> 1) | (type(MonthIn)<> 1) | (type(DayIn)<> 1) then
+ error(msprintf(gettext("%s: Wrong type for input arguments.\n"),"datenum"));
+ end
+
+ if (size(YearIn) <> size(MonthIn)) | (size(YearIn) <> size(DayIn)) then
+ error(msprintf(gettext("%s: Wrong size for input arguments: Same size expected.\n"),"datenum"));
+ end
+
+ if min(MonthIn)<1 | max(MonthIn)>12 then
+ error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"datenum",2,1,12));
+ end
+
+ if min(DayIn)<1 | max(DayIn)>31 then
+ error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"datenum",3,1,31));
+ end
+
+ [nr,nc] = size(YearIn);
+ n = ymdhmns_to_scalar(YearIn,MonthIn,DayIn,zeros(nr,nc),zeros(nr,nc),zeros(nr,nc));
+
+ break
+
+ case 6
+
+ YearIn = varargin(1);
+ MonthIn = varargin(2);
+ DayIn = varargin(3);
+ HourIn = varargin(4);
+ MinIn = varargin(5);
+ SecIn = varargin(6);
+
+ // checks
+
+ if (type(YearIn) <> 1) | ..
+ (type(MonthIn)<> 1) | ..
+ (type(DayIn) <> 1) | ..
+ (type(HourIn) <> 1) | ..
+ (type(MinIn) <> 1) | ..
+ (type(SecIn) <> 1) then
+ error(msprintf(gettext("%s: Wrong type for input arguments.\n"),"datenum"));
+ end
+
+ if (size(YearIn) <> size(MonthIn)) | ..
+ (size(YearIn) <> size(DayIn)) | ..
+ (size(YearIn) <> size(HourIn)) | ..
+ (size(YearIn) <> size(MinIn)) | ..
+ (size(YearIn) <> size(SecIn)) then
+ error(msprintf(gettext("%s: Wrong size for input arguments: Same size expected.\n"),"datenum"));
+ end
+
+ if min(MonthIn)<1 | max(MonthIn)>12 then
+ error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"datenum",2,1,12));
+ end
+
+ if min(DayIn)<1 | max(DayIn)>31 then
+ error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"datenum",3,1,31));
+ end
+
+ if min(HourIn)<0 | max(HourIn)>23 then
+ error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"datenum",4,0,23));
+ end
+
+ if min(MinIn)<0 | max(MinIn)>59 then
+ error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"datenum",5,0,59));
+ end
+
+ if min(SecIn)<0 | max(SecIn)>=60 then
+ error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be between %d and %d.\n"),"datenum",6,0,59));
+ end
+
+ n = ymdhmns_to_scalar(YearIn,MonthIn,DayIn,HourIn,MinIn,SecIn);
+
+ break
+ else
+ error(msprintf(gettext("%s: Wrong number of input argument.\n"),"datenum"));
+ end
+
+
+endfunction
+
+
+function scalaire=ymdhmns_to_scalar (annee,mois,jour,heure,mn,seconde)
+
+ decimal_part = (seconde*(1/(24*3600)))+(mn*(1/(24*60)))+(heure*(1/24));
+
+ // convert of month and day
+ integer_part = jour + floor((mois * 3057 - 3007) / 100);
+
+ // On retranche 1 si le mois est au dela de février
+ integer_part = integer_part + ((mois < 3) - 1);
+
+ // On retranche encore 1 si le mois est au dela de février et année non bissextile
+ integer_part = integer_part + (((mois < 3)|(isLeapYear(annee))) -1);
+
+ // Convertion des année
+ leap_year_case = annee * 365 + (annee / 4) - floor(annee / 100) + floor(annee / 400);
+ not_leap_year_case = annee * 365 + floor(annee/4) + 1 - floor(annee / 100) + floor(annee / 400);
+
+ leap_year_case(~isLeapYear(annee)) = 0;
+ not_leap_year_case(isLeapYear(annee)) = 0;
+
+ integer_part = integer_part + leap_year_case + not_leap_year_case;
+
+ scalaire = integer_part+decimal_part;
+
+endfunction