Mercurial > hg > octave-lyh
annotate scripts/time/datenum.m @ 11587:c792872f8942
all script files: untabify and strip trailing whitespace
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 20 Jan 2011 17:35:29 -0500 |
parents | fd0a3ac60b0e |
children | d0b799dafede |
rev | line source |
---|---|
11523 | 1 ## Copyright (C) 2006-2011 Paul Kienzle |
5661 | 2 ## |
3 ## This file is part of Octave. | |
4 ## | |
5 ## Octave is free software; you can redistribute it and/or modify it | |
6 ## under the terms of the GNU General Public License as published by | |
7016 | 7 ## the Free Software Foundation; either version 3 of the License, or (at |
8 ## your option) any later version. | |
5661 | 9 ## |
10 ## Octave is distributed in the hope that it will be useful, but | |
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 ## General Public License for more details. | |
14 ## | |
15 ## You should have received a copy of the GNU General Public License | |
7016 | 16 ## along with Octave; see the file COPYING. If not, see |
17 ## <http://www.gnu.org/licenses/>. | |
5661 | 18 |
5660 | 19 ## -*- texinfo -*- |
10793
be55736a0783
Grammarcheck the documentation from m-files.
Rik <octave@nomad.inbox5.com>
parents:
10635
diff
changeset
|
20 ## @deftypefn {Function File} {} datenum (@var{year}, @var{month}, @var{day}) |
5661 | 21 ## @deftypefnx {Function File} {} datenum (@var{year}, @var{month}, @var{day}, @var{hour}) |
22 ## @deftypefnx {Function File} {} datenum (@var{year}, @var{month}, @var{day}, @var{hour}, @var{minute}) | |
23 ## @deftypefnx {Function File} {} datenum (@var{year}, @var{month}, @var{day}, @var{hour}, @var{minute}, @var{second}) | |
24 ## @deftypefnx {Function File} {} datenum (@code{"date"}) | |
25 ## @deftypefnx {Function File} {} datenum (@code{"date"}, @var{p}) | |
5660 | 26 ## Returns the specified local time as a day number, with Jan 1, 0000 |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
27 ## being day 1. By this reckoning, Jan 1, 1970 is day number 719529. |
5661 | 28 ## The fractional portion, @var{p}, corresponds to the portion of the |
29 ## specified day. | |
5660 | 30 ## |
5661 | 31 ## Notes: |
32 ## | |
33 ## @itemize | |
34 ## @item | |
5660 | 35 ## Years can be negative and/or fractional. |
10821
693e22af08ae
Grammarcheck documentation of m-files
Rik <octave@nomad.inbox5.com>
parents:
10793
diff
changeset
|
36 ## |
5661 | 37 ## @item |
5660 | 38 ## Months below 1 are considered to be January. |
10821
693e22af08ae
Grammarcheck documentation of m-files
Rik <octave@nomad.inbox5.com>
parents:
10793
diff
changeset
|
39 ## |
5661 | 40 ## @item |
5660 | 41 ## Days of the month start at 1. |
10821
693e22af08ae
Grammarcheck documentation of m-files
Rik <octave@nomad.inbox5.com>
parents:
10793
diff
changeset
|
42 ## |
5661 | 43 ## @item |
5660 | 44 ## Days beyond the end of the month go into subsequent months. |
10821
693e22af08ae
Grammarcheck documentation of m-files
Rik <octave@nomad.inbox5.com>
parents:
10793
diff
changeset
|
45 ## |
5661 | 46 ## @item |
5660 | 47 ## Days before the beginning of the month go to the previous month. |
10821
693e22af08ae
Grammarcheck documentation of m-files
Rik <octave@nomad.inbox5.com>
parents:
10793
diff
changeset
|
48 ## |
5661 | 49 ## @item |
5660 | 50 ## Days can be fractional. |
5661 | 51 ## @end itemize |
5660 | 52 ## |
5661 | 53 ## @strong{Warning:} this function does not attempt to handle Julian |
5660 | 54 ## calendars so dates before Octave 15, 1582 are wrong by as much |
55 ## as eleven days. Also be aware that only Roman Catholic countries | |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
56 ## adopted the calendar in 1582. It took until 1924 for it to be |
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
57 ## adopted everywhere. See the Wikipedia entry on the Gregorian |
5660 | 58 ## calendar for more details. |
59 ## | |
5661 | 60 ## @strong{Warning:} leap seconds are ignored. A table of leap seconds |
5660 | 61 ## is available on the Wikipedia entry for leap seconds. |
62 ## @seealso{date, clock, now, datestr, datevec, calendar, weekday} | |
63 ## @end deftypefn | |
64 | |
65 ## Algorithm: Peter Baum (http://vsg.cape.com/~pbaum/date/date0.htm) | |
5687 | 66 ## Author: pkienzle <pkienzle@users.sf.net> |
5660 | 67 |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
68 function [days, secs] = datenum (year, month, day, hour, minute, second) |
5661 | 69 |
5660 | 70 ## Days until start of month assuming year starts March 1. |
5661 | 71 persistent monthstart = [306; 337; 0; 31; 61; 92; 122; 153; 184; 214; 245; 275]; |
5660 | 72 |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
73 if (nargin == 0 || (nargin > 2 && ischar (year)) || nargin > 6) |
6046 | 74 print_usage (); |
5660 | 75 endif |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
76 if (ischar (year)) |
5661 | 77 if (nargin < 2) |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
78 month = []; |
5661 | 79 endif |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
80 [year, month, day, hour, minute, second] = datevec (year, month); |
5660 | 81 else |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
82 if (nargin < 6) second = 0; endif |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
83 if (nargin < 5) minute = 0; endif |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
84 if (nargin < 4) hour = 0; endif |
5661 | 85 if (nargin == 1) |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
86 nc = columns (year); |
5661 | 87 if (nc > 6 || nc < 3) |
11472
1740012184f9
Use uppercase for variable names in error() strings to match Info documentation. Only m-files done.
Rik <octave@nomad.inbox5.com>
parents:
11469
diff
changeset
|
88 error ("datenum: expected date vector containing [YEAR, MONTH, DAY, HOUR, MINUTE, SECOND]"); |
5660 | 89 endif |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
90 second = minute = hour = 0; |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
91 if (nc >= 6) second = year(:,6); endif |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
92 if (nc >= 5) minute = year(:,5); endif |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
93 if (nc >= 4) hour = year(:,4); endif |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
94 day = year(:,3); |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
95 month = year(:,2); |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
96 year = year(:,1); |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
97 endif |
5660 | 98 endif |
99 | |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
100 month(month<1) = 1; ## For compatibility. Otherwise allow negative months. |
5660 | 101 |
102 ## Set start of year to March by moving Jan. and Feb. to previous year. | |
103 ## Correct for months > 12 by moving to subsequent years. | |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
104 year += fix ((month-14)/12); |
5660 | 105 |
106 ## Lookup number of days since start of the current year. | |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
107 if (numel (month) == 1 || numel (day) == 1) |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
108 ## Allow month or day to be scalar while other values may be vectors or |
7782
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
109 ## matrices. |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
110 day += monthstart (mod (month-1,12) + 1) + 60; |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
111 if (numel (month) > 1) |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
112 day = reshape (day, size (month)); |
7782
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
113 endif |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
114 else |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
115 day += reshape (monthstart (mod (month-1,12) + 1), size (day)) + 60; |
7782
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
116 endif |
5660 | 117 |
118 ## Add number of days to the start of the current year. Correct | |
119 ## for leap year every 4 years except centuries not divisible by 400. | |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
120 day += 365*year + floor (year/4) - floor (year/100) + floor (year/400); |
5660 | 121 |
122 ## Add fraction representing current second of the day. | |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
123 days = day + (hour+(minute+second/60)/60)/24; |
5660 | 124 |
125 ## Output seconds if asked so that etime can be more accurate | |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
10821
diff
changeset
|
126 secs = 86400*day + hour*3600 + minute*60 + second; |
5660 | 127 |
128 endfunction | |
129 | |
130 %!shared part | |
131 %! part = 0.514623842592593; | |
132 %!assert(datenum(2001,5,19), 730990) | |
133 %!assert(datenum([1417,6,12]), 517712) | |
134 %!assert(datenum([2001,5,19;1417,6,12]), [730990;517712]) | |
135 %!assert(datenum(2001,5,19,12,21,3.5), 730990+part, eps) | |
136 %!assert(datenum([1417,6,12,12,21,3.5]), 517712+part, eps) | |
7659
4ab2488ab2b4
datenum: allow vector inputs in any orientation
Bill Denny
parents:
7017
diff
changeset
|
137 ## Test vector inputs |
5660 | 138 %!test |
139 %! t = [2001,5,19,12,21,3.5; 1417,6,12,12,21,3.5]; | |
140 %! n = [730990; 517712] + part; | |
141 %! assert(datenum(t), n, 2*eps); | |
7659
4ab2488ab2b4
datenum: allow vector inputs in any orientation
Bill Denny
parents:
7017
diff
changeset
|
142 ## Make sure that the vectors can have either orientation |
4ab2488ab2b4
datenum: allow vector inputs in any orientation
Bill Denny
parents:
7017
diff
changeset
|
143 %!test |
4ab2488ab2b4
datenum: allow vector inputs in any orientation
Bill Denny
parents:
7017
diff
changeset
|
144 %! t = [2001,5,19,12,21,3.5; 1417,6,12,12,21,3.5]'; |
4ab2488ab2b4
datenum: allow vector inputs in any orientation
Bill Denny
parents:
7017
diff
changeset
|
145 %! n = [730990 517712] + part; |
4ab2488ab2b4
datenum: allow vector inputs in any orientation
Bill Denny
parents:
7017
diff
changeset
|
146 %! assert(datenum(t(1,:), t(2,:), t(3,:), t(4,:), t(5,:), t(6,:)), n, 2*eps); |
7782
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
147 |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
148 ## Test mixed vectors and scalars |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
149 %!assert (datenum([2008;2009], 1, 1), [datenum(2008, 1, 1);datenum(2009, 1, 1)]); |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
150 %!assert (datenum(2008, [1;2], 1), [datenum(2008, 1, 1);datenum(2008, 2, 1)]); |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
151 %!assert (datenum(2008, 1, [1;2]), [datenum(2008, 1, 1);datenum(2008, 1, 2)]); |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
152 %!assert (datenum([2008;2009], [1;2], 1), [datenum(2008, 1, 1);datenum(2009, 2, 1)]); |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
153 %!assert (datenum([2008;2009], 1, [1;2]), [datenum(2008, 1, 1);datenum(2009, 1, 2)]); |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
154 %!assert (datenum(2008, [1;2], [1;2]), [datenum(2008, 1, 1);datenum(2008, 2, 2)]); |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
155 ## And the other orientation |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
156 %!assert (datenum([2008 2009], 1, 1), [datenum(2008, 1, 1) datenum(2009, 1, 1)]); |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
157 %!assert (datenum(2008, [1 2], 1), [datenum(2008, 1, 1) datenum(2008, 2, 1)]); |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
158 %!assert (datenum(2008, 1, [1 2]), [datenum(2008, 1, 1) datenum(2008, 1, 2)]); |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
159 %!assert (datenum([2008 2009], [1 2], 1), [datenum(2008, 1, 1) datenum(2009, 2, 1)]); |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
160 %!assert (datenum([2008 2009], 1, [1 2]), [datenum(2008, 1, 1) datenum(2009, 1, 2)]); |
bfd8d804e6d3
datenum\: fixed combination of scalar and vector/matrix input bug
bill@denney.ws
parents:
7659
diff
changeset
|
161 %!assert (datenum(2008, [1 2], [1 2]), [datenum(2008, 1, 1) datenum(2008, 2, 2)]); |