* Bug #14423 fixed - bench_run did not have a return value, export file was not confi...
[scilab.git] / scilab / modules / time / macros / datevec.sci
1 //------------------------------------------------------------------------
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) INRIA - Pierre MARECHAL
4 //
5 // Copyright (C) 2012 - 2016 - Scilab Enterprises
6 //
7 // This file is hereby licensed under the terms of the GNU GPL v2.0,
8 // pursuant to article 5.3.4 of the CeCILL v.2.1.
9 // This file was originally licensed under the terms of the CeCILL v2.1,
10 // and continues to be available under such terms.
11 // For more information, see the COPYING file which you should have received
12 // along with this program.
13
14 // Copyright INRIA
15 // Date : 28 Dec 2005
16 //------------------------------------------------------------------------
17
18 function [Y,M,D,h,m,s] = datevec(N)
19
20     lhs=argn(1);
21     rhs=argn(2);
22
23     common_year = [0,31,59,90,120,151,181,212,243,273,304,334,365];
24     leap_year   = [0,31,60,91,121,152,182,213,244,274,305,335,366];
25
26     if rhs<>1 then
27         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"datevec",1));
28     end
29
30     if type(N) <> 1 then
31         error(msprintf(gettext("%s: Wrong type for input argument #%d: Real matrix expected.\n"),"datevec",1));
32     end
33
34     [nr,nc] = size(N);
35
36     if nc == 1 then
37         common_year = common_year';
38         leap_year   = leap_year';
39     end
40
41     // for the moment : hour, minute, second
42     // =========================================================================
43
44     second = 86400*(N-floor(N));
45     hour   = floor(second/3600);
46     second = second - 3600*hour;
47     minute = floor(second/60);
48     second = second - 60*minute;
49
50     // Now, the year
51     // =========================================================================
52
53     N    = floor(N);
54     Year = floor(N/365.2425);
55
56     temp = N - (365.0*Year + ceil(0.25*Year)- ceil(0.01*Year) + ceil(0.0025*Year));
57
58     // On retranche 1 si la valeur est inferieur à 0
59
60     mask       = find(temp <= 0);
61     if ~isempty(mask)
62         Year(mask) = Year(mask)-1;
63
64         N(mask)    = N(mask) - (365.0*Year(mask) + ceil(0.25*Year(mask)) - ceil(0.01*Year(mask)) + ceil(0.0025*Year(mask)));
65         N(~mask)   = temp(~mask);
66     else
67         N = temp;
68     end
69
70     // ... and the month
71     // =========================================================================
72
73     Month = int (N/29);
74
75     // construction de la matrice
76
77     month_day_mat = ones(nr,nc);
78     idx_leap_year = isLeapYear(Year);
79
80     if ~isempty(Month(idx_leap_year))
81         month_day_mat(idx_leap_year)  = leap_year(Month(idx_leap_year)+1);
82     end
83     if ~isempty(Month(~idx_leap_year))
84         month_day_mat(~idx_leap_year) = common_year(Month(~idx_leap_year)+1);
85     end
86
87     Month( N>month_day_mat ) = Month( N>month_day_mat )+1;
88
89     Day = ones(nr,nc);
90
91     if ~isempty(Month(idx_leap_year))
92         month_day_mat(idx_leap_year)  = leap_year(Month(idx_leap_year));
93     end
94     if ~isempty(Month(~idx_leap_year))
95         month_day_mat(~idx_leap_year) = common_year(Month(~idx_leap_year));
96     end
97
98     Day = N - month_day_mat;
99
100     if (lhs==1) then
101         Y(:,1) = matrix(Year  ,nr*nc , 1);
102         Y(:,2) = matrix(Month ,nr*nc , 1);
103         Y(:,3) = matrix(Day   ,nr*nc , 1);
104         Y(:,4) = matrix(hour  ,nr*nc , 1);
105         Y(:,5) = matrix(minute,nr*nc , 1);
106         Y(:,6) = matrix(second,nr*nc , 1);
107     else
108         Y = Year;
109         M = Month;
110         D = Day;
111         h = hour;
112         m = minute;
113         s = second;
114     end
115
116 endfunction