Mercurial > hg > octave-nkf
annotate scripts/time/addtodate.m @ 18063:1e9cb13faa7a
ls.m: Strip tailing UNIX file separator when running in Windows environment (bug #40726).
* ls.m: Strip tailing UNIX file separator when running in Windows environment
(bug #40726).
author | Rik <rik@octave.org> |
---|---|
date | Tue, 03 Dec 2013 13:13:44 -0800 |
parents | d63878346099 |
children | 4197fc428c7d |
rev | line source |
---|---|
17744
d63878346099
maint: Update copyright notices for release.
John W. Eaton <jwe@octave.org>
parents:
17281
diff
changeset
|
1 ## Copyright (C) 2008-2013 Bill Denney |
7656 | 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 | |
7 ## the Free Software Foundation; either version 3 of the License, or (at | |
8 ## your option) any later version. | |
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 | |
16 ## along with Octave; see the file COPYING. If not, see | |
17 ## <http://www.gnu.org/licenses/>. | |
18 | |
19 ## -*- texinfo -*- | |
20 ## @deftypefn {Function File} {@var{d} =} addtodate (@var{d}, @var{q}, @var{f}) | |
13929
9cae456085c2
Grammarcheck of documentation before 3.6.0 release.
Rik <octave@nomad.inbox5.com>
parents:
13856
diff
changeset
|
21 ## Add @var{q} amount of time (with units @var{f}) to the serial datenum, |
9cae456085c2
Grammarcheck of documentation before 3.6.0 release.
Rik <octave@nomad.inbox5.com>
parents:
13856
diff
changeset
|
22 ## @var{d}. |
7656 | 23 ## |
17281
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
14363
diff
changeset
|
24 ## @var{f} must be one of @qcode{"year"}, @qcode{"month"}, @qcode{"day"}, |
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
14363
diff
changeset
|
25 ## @qcode{"hour"}, @qcode{"minute"}, @qcode{"second"}, or |
bc924baa2c4e
doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents:
14363
diff
changeset
|
26 ## @qcode{"millisecond"}. |
13856
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
27 ## @seealso{datenum, datevec, etime} |
7656 | 28 ## @end deftypefn |
29 | |
30 ## Author: Bill Denney <bill@denney.ws> | |
31 | |
32 function d = addtodate (d, q, f) | |
33 | |
13856
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
34 persistent mult = struct ("day", 1, "hour", 1/24, "minute", 1/1440, ... |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
35 "second", 1/86400, "millisecond", 1/86400000); |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
36 |
7656 | 37 if (nargin != 3) |
38 print_usage (); | |
13856
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
39 elseif (! (ischar (f) && isrow (f))) |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
40 error ("addtodate: F must be a single character string"); |
7656 | 41 endif |
42 | |
13856
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
43 if (isscalar (d) && ! isscalar (q)) |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
44 ## expand d to size of q to make later addition easier. |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
45 d = repmat (d, size (q)); |
7656 | 46 endif |
47 | |
13856
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
48 ## in case the user gives f as a plural, remove the 's' |
7656 | 49 if ("s" == f(end)) |
50 f(end) = []; | |
51 endif | |
52 | |
53 if (any (strcmpi ({"year" "month"}, f))) | |
54 dtmp = datevec (d); | |
55 if (strcmpi ("year", f)) | |
56 dtmp(:,1) += q(:); | |
57 elseif (strcmpi ("month", f)) | |
58 dtmp(:,2) += q(:); | |
59 ## adjust the years and months if the date rolls over a year | |
60 dtmp(:,1) += floor ((dtmp(:,2)-1)/12); | |
61 dtmp(:,2) = mod (dtmp(:,2)-1, 12) + 1; | |
62 endif | |
63 dnew = datenum (dtmp); | |
64 ## make the output the right shape | |
65 if (numel (d) == numel (dnew)) | |
66 d = reshape (dnew, size (d)); | |
67 else | |
68 d = reshape (dnew, size (q)); | |
69 endif | |
13856
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
70 elseif (any (strcmpi ({"day" "hour" "minute" "second", "millisecond"}, f))) |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
71 d += q .* mult.(f); |
7656 | 72 else |
8664 | 73 error ("addtodate: Invalid time unit: %s", f); |
7656 | 74 endif |
75 | |
76 endfunction | |
77 | |
13856
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
78 |
7656 | 79 ## tests |
80 %!shared d | |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
81 %! d = datenum (2008, 1, 1); |
7656 | 82 ## Identity |
83 %!assert (addtodate (d, 0, "year"), d) | |
84 %!assert (addtodate (d, 0, "month"), d) | |
85 %!assert (addtodate (d, 0, "day"), d) | |
86 %!assert (addtodate (d, 0, "hour"), d) | |
87 %!assert (addtodate (d, 0, "minute"), d) | |
88 %!assert (addtodate (d, 0, "second"), d) | |
13856
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
89 %!assert (addtodate (d, 0, "millisecond"), d) |
7656 | 90 ## Add one of each |
91 ## leap year | |
92 %!assert (addtodate (d, 1, "year"), d+366) | |
93 %!assert (addtodate (d, 1, "month"), d+31) | |
94 %!assert (addtodate (d, 1, "day"), d+1) | |
95 %!assert (addtodate (d, 1, "hour"), d+1/24) | |
96 %!assert (addtodate (d, 1, "minute"), d+1/1440) | |
97 %!assert (addtodate (d, 1, "second"), d+1/86400) | |
13856
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
98 %!assert (addtodate (d, 1, "millisecond"), d+1/86400000) |
7656 | 99 ## substract one of each |
100 %!assert (addtodate (d, -1, "year"), d-365) | |
101 %!assert (addtodate (d, -1, "month"), d-31) | |
102 %!assert (addtodate (d, -1, "day"), d-1) | |
103 %!assert (addtodate (d, -1, "hour"), d-1/24) | |
104 %!assert (addtodate (d, -1, "minute"), d-1/1440) | |
105 %!assert (addtodate (d, -1, "second"), d-1/86400) | |
13856
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
106 %!assert (addtodate (d, -1, "millisecond"), d-1/86400000) |
7656 | 107 ## rollover |
108 %!assert (addtodate (d, 12, "month"), d+366) | |
109 %!assert (addtodate (d, 13, "month"), d+366+31) | |
110 ## multiple inputs and output orientation | |
111 %!assert (addtodate ([d d], [1 13], "month"), [d+31 d+366+31]) | |
112 %!assert (addtodate ([d;d], [1;13], "month"), [d+31;d+366+31]) | |
113 %!assert (addtodate (d, [1;13], "month"), [d+31;d+366+31]) | |
114 %!assert (addtodate (d, [1 13], "month"), [d+31 d+366+31]) | |
115 %!assert (addtodate ([d;d+1], 1, "month"), [d+31;d+1+31]) | |
116 %!assert (addtodate ([d d+1], 1, "month"), [d+31 d+1+31]) | |
13856
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
117 |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
118 %% Test input validation |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
119 %!error addtodate () |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
120 %!error addtodate (1) |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
121 %!error addtodate (1,2) |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
122 %!error addtodate (1,2,3,4) |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
123 %!error <F must be a single character string> addtodate (1,2,3) |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
124 %!error <F must be a single character string> addtodate (1,2,"month"') |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
125 %!error <Invalid time unit> addtodate (1,2,"abc") |
d490ca8ab1a5
Modernize function implementations and docstrings in scripts/time.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
126 |