# HG changeset patch # User jwe # Date 1142012618 0 # Node ID 13be36ec8279f85f5658eacc1075211218b19b12 # Parent 4c4d31ecb0e4ae691dc5e280baa4c2f62323cef4 [project @ 2006-03-10 17:43:38 by jwe] diff --git a/scripts/ChangeLog b/scripts/ChangeLog --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,8 @@ +2006-03-10 Paul Kienzle + + * time/etime.m: Use datenum to support times spanning year boundaries. + * time/datenum.m: New function to compute day number from time. + 2006-03-09 John W. Eaton * miscellaneous/unix.m, plot/print.m: diff --git a/scripts/time/datenum.m b/scripts/time/datenum.m --- a/scripts/time/datenum.m +++ b/scripts/time/datenum.m @@ -1,57 +1,93 @@ +## Copyright (C) 2006 Paul Kienzle +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. +## +## Octave is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, write to the Free +## Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +## 02110-1301, USA. + ## -*- texinfo -*- -## @deftypefn {Function File} {} datenum(Y, M, D [, h , m [, s]]) -## @deftypefnx {Function File} {} datenum('date' [, P]) +## @deftypefn {Function File} {} datenum (@var{year}, @var{month}, @var{day}) +## @deftypefnx {Function File} {} datenum (@var{year}, @var{month}, @var{day}, @var{hour}) +## @deftypefnx {Function File} {} datenum (@var{year}, @var{month}, @var{day}, @var{hour}, @var{minute}) +## @deftypefnx {Function File} {} datenum (@var{year}, @var{month}, @var{day}, @var{hour}, @var{minute}, @var{second}) +## @deftypefnx {Function File} {} datenum (@code{"date"}) +## @deftypefnx {Function File} {} datenum (@code{"date"}, @var{p}) ## Returns the specified local time as a day number, with Jan 1, 0000 -## being day 1. By this reckoning, Jan 1, 1970 is day number 719529. -## The fractional portion, corresponds to the portion of the specified day. +## being day 1. By this reckoning, Jan 1, 1970 is day number 719529. +## The fractional portion, @var{p}, corresponds to the portion of the +## specified day. ## +## Notes: +## +## @itemize +## @item ## Years can be negative and/or fractional. +## @item ## Months below 1 are considered to be January. +## @item ## Days of the month start at 1. +## @item ## Days beyond the end of the month go into subsequent months. +## @item ## Days before the beginning of the month go to the previous month. +## @item ## Days can be fractional. +## @end itemize ## -## WARNING: this function does not attempt to handle Julian +## @strong{Warning:} this function does not attempt to handle Julian ## calendars so dates before Octave 15, 1582 are wrong by as much ## as eleven days. Also be aware that only Roman Catholic countries ## adopted the calendar in 1582. It took until 1924 for it to be ## adopted everywhere. See the Wikipedia entry on the Gregorian ## calendar for more details. ## -## WARNING: leap seconds are ignored. A table of leap seconds +## @strong{Warning:} leap seconds are ignored. A table of leap seconds ## is available on the Wikipedia entry for leap seconds. ## @seealso{date, clock, now, datestr, datevec, calendar, weekday} ## @end deftypefn ## Algorithm: Peter Baum (http://vsg.cape.com/~pbaum/date/date0.htm) ## Author: Paul Kienzle -## This program is granted to the public domain. -function [days,secs] = datenum(Y,M,D,h,m,s) +function [days, secs] = datenum (Y, M, D, h, m, s) + ## Days until start of month assuming year starts March 1. - persistent monthstart = [306;337;0;31;61;92;122;153;184;214;245;275]; + persistent monthstart = [306; 337; 0; 31; 61; 92; 122; 153; 184; 214; 245; 275]; - if nargin == 0 || (nargin > 2 && ischar(Y)) || nargin > 6 - usage("n=datenum('date' [, P]) or n=datenum(Y, M, D [, h, m [, s]])"); + if (nargin == 0 || (nargin > 2 && ischar (Y)) || nargin > 6) + usage ("n = datenum ('date' [, P]) or n = datenum (Y, M, D [, h, m [, s]])"); endif - if ischar(Y) - if nargin < 2, M=[]; endif - error('string form of dates not yet supported'); - ## [Y,M,D,h,m,s] = datevec(Y,M); + if (ischar (Y)) + if (nargin < 2) + M = []; + endif + error ("string form of dates not yet supported"); + ## [Y, M, D, h, m, s] = datevec (Y, M); else - if nargin < 6, s = 0; endif - if nargin < 5, m = 0; endif - if nargin < 4, h = 0; endif - if nargin == 1 - nc = columns(Y); - if nc > 6 || nc < 3, - error("expected date vector containing [Y,M,D,h,m,s]"); + if (nargin < 6) s = 0; endif + if (nargin < 5) m = 0; endif + if (nargin < 4) h = 0; endif + if (nargin == 1) + nc = columns (Y); + if (nc > 6 || nc < 3) + error ("expected date vector containing [Y, M, D, h, m, s]"); endif - s=m=h = 0; - if nc >= 6, s = Y(:,6); endif - if nc >= 5, m = Y(:,5); endif - if nc >= 4, h = Y(:,4); endif + s = m = h = 0; + if (nc >= 6) s = Y(:,6); endif + if (nc >= 5) m = Y(:,5); endif + if (nc >= 4) h = Y(:,4); endif D = Y(:,3); M = Y(:,2); Y = Y(:,1); @@ -62,14 +98,14 @@ ## Set start of year to March by moving Jan. and Feb. to previous year. ## Correct for months > 12 by moving to subsequent years. - Y += fix((M-14)/12); + Y += fix ((M-14)/12); ## Lookup number of days since start of the current year. D += monthstart (mod (M-1,12) + 1) + 60; ## Add number of days to the start of the current year. Correct ## for leap year every 4 years except centuries not divisible by 400. - D += 365*Y+floor(Y/4)-floor(Y/100)+floor(Y/400); + D += 365*Y + floor (Y/4) - floor (Y/100) + floor (Y/400); ## Add fraction representing current second of the day. days = D + (h+(m+s/60)/60)/24;