diff options
Diffstat (limited to 'modules/time/macros/datenum.sci')
-rwxr-xr-x | modules/time/macros/datenum.sci | 192 |
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 |