Mercurial > forge
changeset 2380:ea964f5d3ce6 octave-forge
Changed the directory structure of time to match the package system
author | hauberg |
---|---|
date | Sun, 20 Aug 2006 14:26:40 +0000 |
parents | 066694769f07 |
children | edfc182214c3 |
files | main/time/COPYING main/time/DESCRIPTION main/time/datesplit.m main/time/inst/datesplit.m |
diffstat | 4 files changed, 830 insertions(+), 480 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main/time/COPYING Sun Aug 20 14:26:40 2006 +0000 @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 19yy <name of author> + + This program 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 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main/time/DESCRIPTION Sun Aug 20 14:26:40 2006 +0000 @@ -0,0 +1,11 @@ +Name: time +Version: 1.0.0 +Date: 2006-08-05 +Author: Bill Denney <bill@givebillmoney.com> +Maintainer: Bill Denney <bill@givebillmoney.com> +Title: Time and Dates. +Description: Add a description to this package! +Categories: Time +Depends: octave (>= 2.9.7) +License: GPL version 2 or later +Url: http://octave.sf.net
--- a/main/time/datesplit.m Sun Aug 20 14:23:56 2006 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,480 +0,0 @@ -## Copyright (C) 2001 Bill Denney <bill@givebillmoney.com> -## -## This program 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 of the License, or -## (at your option) any later version. -## -## This program 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 this program; if not, write to the Free Software -## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -## -*- texinfo -*- -## @deftypefn {Function File} {Y =} datesplit(date, P) -## @deftypefnx {Function File} {[Y,M,D,h,m,s] =} datesplit(date, P) -## Split a date string into the Year, Month, Day, hour, minute, and -## second. This routine tries to be as forgiving as possible to the -## date input while requiring that the date is not ambiguous. -## -## Anywhere possible where it would not be ambiguous, efforts were made -## to make times possible with seconds and AM/PM as optional. Also, -## along the same lines, where possible, commas were allowed with -## spaces, and the year/month/day separators were allowed as period (.), -## slash (/), and dash (-). Not all format possibilities are shown in -## the following table, but a date like @code{dd-mmm-yyyy HH:MM:SS} is -## parsed just as well as @code{d/mmm.yyyy, ,H:MM, AM}. -## -## Supported @code{date} formats include (the same as datestr): -## @multitable @columnfractions 0.1 0.45 0.45 -## @item @strong{Code} @tab @strong{Format} @tab @strong{Example} -## @item 0 @tab dd-mmm-yyyy HH:MM:SS @tab 07-Sep-2000 15:38:09 -## @item 1 @tab dd-mmm-yyyy @tab 07-Sep-2000 -## @item 2 @tab mm/dd/yy @tab 09/07/00 -## @item 3 @tab mmm @tab Sep -## @item 6 @tab mm/dd @tab 09/13 -## @item 10 @tab yyyy @tab 2000 -## @item 12 @tab mmmyy @tab Sep00 -## @item 13 @tab HH:MM:SS @tab 15:38:09 -## @item 14 @tab HH:MM:SS PM @tab 03:38:09 PM -## @item 15 @tab HH:MM @tab 15:38 -## @item 16 @tab HH:MM PM @tab 03:38 PM -## @item 17 @tab QQ-YY @tab Q3-00 -## @item 19 @tab dd/mm @tab 13/03 -## @item 20 @tab dd/mm/yy @tab 13/03/95 -## @item 21 @tab mmm.dd.yyyy HH:MM:SS @tab Mar.03.1962 13:53:06 -## @item 22 @tab mmm.dd.yyyy @tab Mar.03.1962 -## @item 23 @tab mm/dd/yyyy @tab 03/13/1962 -## @item 24 @tab dd/mm/yyyy @tab 12/03/1962 -## @item 25 @tab yy/mm/dd @tab 95/03/13 -## @item 26 @tab yyyy/mm/dd @tab 1995/03/13 -## @item 27 @tab QQ-YYYY @tab Q4-2132 -## @item 28 @tab mmmyyyy @tab Mar2047 -## @item 29 @tab yyyymmdd @tab 20470313 -## @item 30 @tab yyyymmddTHHMMSS @tab 20470313T132603 -## @item 31 @tab yyyy-mm-dd HH:MM:SS @tab 1047-03-13 13:26:03 -## @end multitable -## -## The parameter @code{P} is needed to convert date strings with 2 digit -## years into dates with 4 digit years. 2 digit years are assumed to be -## between @code{P} and @code{P+99}. If @code{P} is not given then the -## current year - 50 is used, so that dates are centered on the present. -## For birthdates, you would want @code{P} to be current year - 99. For -## appointments, you would want @code{P} to be current year. -## -## This function makes no strong attempt to verify the accuracy of the -## numbers that it returns in that it doesn't (currently) check to see -## that you're not trying to use the date Feb 30. When applicable, it -## tries to make your input work, though. It will try to determine if -## you're using the date "03/13/95" that the date is "March 13, 1995", -## but if there is doubt, datesplit will return an error instead of -## trying to guess the wrong value. -## -## @seealso{date,clock,now,datestr,datenum,calendar,weekday} -## @end deftypefn - -## TODO: -## * Some formats are ambiguous. Allow the user to specify the format -## to remove ambiguity. -## * Validate the dates. -## * Possible bug (after dates are validated): There are times where -## the year is assumed, Feb 29 may be a valid date, but with the -## assumed year, it may become invalid. -## * Internationalize. Not all months use the English system. -## * Vectorize. That requires vectorization of regexp though... - -## Author: Bill Denney <bill@givebillmoney.com> - -function [y, m, d, h, mi, s] = datesplit(ds, P) - - if nargin < 2 - P = []; - endif - - today = datevec(now); - - if (isempty(P)) - P = today(1)-50; - endif - - global __month_names = ["Jan";"Feb";"Mar";"Apr";"May";"Jun";... - "Jul";"Aug";"Sep";"Oct";"Nov";"Dec"]; - global __day_names = ["Sun";"Mon";"Tue";"Wed";"Thu";"Fri";"Sat"]; - global __time_names = ["AM";"PM"]; - - if (iscellstr(ds)) - ds = ds{1}; - endif - ds = tolower(deblank(ds)); - - if (nargin < 1) - error("datesplit: no input arguments"); - elseif (nargin == 1) - fmt = []; - endif - %% we have to determine the format, this could be error prone - - ## format 0 dd-mmm-yyyy HH:MM:SS e.g. 07-Sep-2000 15:38:09 - [match, d, m, y, h, mi, s, ap] = \ - of_regexp("^(3[01]|[0-2]?[0-9])[-./]([a-z]{3})[-./]([0-9]{4})[, ]+(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds); - - ## format 21 mmm.dd.yyyy HH:MM:SS e.g. Mar.03.1962 13:53:06 - if (isempty(match)) - [match, m, d, y, h, mi, s, ap] = \ - of_regexp("^([a-z]{3})[-./](3[01]|[0-2]?[0-9])[-./]([0-9]{4})[, ]+(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds); - endif - - ## format 31 yyyy-mm-dd HH:MM:SS e.g. 2004-03-13 13:26:03 - if (isempty(match)) - [match, y, m, d, h, mi, s, ap] = \ - of_regexp("^([0-9]{4})[-./](1[012]|0?[0-9])[-./](3[01]|[0-2]?[0-9])[, ]+(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds); - endif - - ## format 30 yyyymmddTHHMMSS e.g. 20470313T132603 - if (isempty(match)) - [match, y, m, d, h, mi, s] = \ - of_regexp("^([0-9]{4})(1[012]|0[0-9])(3[01]|[012][0-9])t(2[0-3]|[01][0-9])([0-5][0-9])([0-5][0-9])$", ds); - ap = "NA"; - endif - - ## format 13 HH:MM:SS e.g. 15:38:09 - ## format 14 HH:MM:SS PM e.g. 03:38:09 PM - ## format 15 HH:MM e.g. 15:38 - ## format 16 HH:MM PM e.g. 03:38 PM - if (isempty(match)) - [match, h, mi, s, ap] = \ - of_regexp("^(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds); - - if (! isempty(match)) - %% assume that it is as of today - y = today(1); - m = today(2); - d = today(3); - endif - endif - - ## format 1 dd-mmm-yyyy e.g. 07-Sep-2000 - if (isempty(match)) - [match, d, m, y] = \ - of_regexp("^(3[01]|[012]?[0-9])[-./]([a-z]{3})[-./]([0-9]{4})$", ds); - - if (! isempty(match)) - %% assume the beginning of the day - h = 0; - mi = 0; - s = 0; - ap = "NA"; - endif - endif - - ## format 22 mmm.dd.yyyy e.g. Mar.03.1962 - if (isempty(match)) - [match, m, d, y] = \ - of_regexp("^([a-z]{3})[-./](3[01]|[012]?[0-9])[-./]([0-9]{4})$", ds); - - if (! isempty(match)) - %% assume the beginning of the day - h = 0; - mi = 0; - s = 0; - ap = "NA"; - endif - endif - - ## format 2 mm/dd/yy e.g. 09/07/00 - ## format 23 mm/dd/yyyy e.g. 03/13/1962 - ## format 20 dd/mm/yy e.g. 13/03/95 - ## format 24 dd/mm/yyyy e.g. 12/03/1962 - ## format 25 yy/mm/dd e.g. 95/03/13 - ## format 26 yyyy/mm/dd e.g. 1995/03/13 - if (isempty(match)) - [match, d, m, y] = \ - of_regexp("^([0-9]{1,2}|[0-9]{4})[-./](3[01]|[012]?[0-9])[-./]([0-9]{1,2}|[0-9]{4})$", ds); - - if (! isempty(match)) - %% we have to determine if the date is unambiguous - d = str2num(d); - m = str2num(m); - y = str2num(y); - - if ((y == 0) || (y > 31)) - %% we've got the year correct - if ((m > 12) && (d < 13)) - %% we're operating on mm/dd/yyyy - tmp = m; - m = d; - d = tmp; - elseif ((m < 13) && (d > 12)) - %% it's fine - else - %% it's ambiguous - error(["datesplit: ambiguous date " ds]); - endif - elseif ((d == 0) || (d > 31)) - %% the day and the year need to be switched - tmp = y; - y = d; - d = tmp; - else - %% it's ambiguous - error(["datesplit: ambiguous date " ds]); - endif - - %% assume the beginning of the day - h = 0; - mi = 0; - s = 0; - ap = "NA"; - endif - - endif - - ## format 29 yyyymmdd e.g. 20470313 - if (isempty(match)) - [match, y, m, d] = \ - of_regexp("^([0-9]{4})(1[012]|0?[0-9])(3[01]|[012][0-9])$", ds); - %% I've never seen a date that has the year first that was not - %% yyyy/mm/dd, so I'm going to assume that it's unambiguous. - - if (! isempty(match)) - %% assume the beginning of the day - h = 0; - mi = 0; - s = 0; - ap = "NA"; - endif - endif - - ## format 17 QQ-YY e.g. Q3-00 - ## format 27 QQ-YYYY e.g. Q4-2132 - if (isempty(match)) - [match, q, y] = \ - of_regexp("^q([1-4])[-./]([0-9]{2}|[0-9]{4})$", ds); - if (! isempty(match)) - %% Assume that it's the end of the quarter - q = str2num(q); - m = 3*q; - dayopts = [31 30 30 31]; - d = dayopts(q); - - %% assume the end of the day - h = 23; - mi = 59; - s = 59; - ap = "NA"; - endif - endif - - ## format 28 mmmyyyy e.g. Mar2047 - ## format 12 mmmyy e.g. Sep00 - if (isempty(match)) - [match, m, y] = \ - of_regexp("^([a-z]{3})([0-9]{2}|[0-9]{4})$", ds); - if (! isempty(match)) - %% assume the beginning of the month - d = 1; - h = 0; - mi = 0; - s = 0; - ap = "NA"; - endif - endif - - ## format 6 mm/dd e.g. 09/07 - ## format 19 dd/mm e.g. 13/03 - if (isempty(match)) - [match, m, d] = \ - of_regexp("^(3[01]|[012]?[0-9])[-./](3[01]|[012][0-9])$", ds); - - if (! isempty(match)) - m = str2num(m); - d = str2num(d); - - %% we have to determine if the date is unambiguous - if ((m > 12) && (d < 13)) - %% we're operating on mm/dd/yyyy - tmp = m; - m = d; - d = tmp; - elseif ((m < 13) && (d > 12)) - %% it's fine - else - %% it's ambiguous - error(["datesplit: ambiguous date " ds]); - endif - %% assume this year and the beginning of the day - y = today(1); - h = 0; - mi = 0; - s = 0; - ap = "NA"; - endif - endif - - ## format 10 yyyy e.g. 2000 - if (isempty(match)) - [match, y] = of_regexp("^([0-9]{4})$", ds); - - if (! isempty(match)) - %% assume the beginning of the year - m = 1; - d = 1; - h = 0; - mi = 0; - s = 0; - ap = "NA"; - endif - endif - - ## format 3 mmm e.g. Sep - if (isempty(match)) - m = strmatch(ds, tolower(__month_names)); - - if (! isempty(m)) - match = 1; - %% assuming the beginning of the month, this year - y = today(1); - d = 1; - h = 0; - mi = 0; - s = 0; - ap = "NA"; - endif - endif - - ## format 8 ddd e.g. Thu - %% People shouldn't use this function for something like this - - if (isempty(match)) - %% you mean I did all that work, and you still didn't use a valid - %% date? Darn you! - error(["datesplit: Unknown date format " ds]); - endif - - if (! isempty(match)) - if isempty(s) - s = 0; - elseif (ischar(s) && (1 == findstr(s,":"))) - s = s(2:3); - endif - if isempty(ap) - ap = "NA"; - endif - endif - - %% start converting the date from characters to numbers - if (ischar(y)) - y = str2num(y); - if (isempty(y)) - error(["datesplit: Invalid year specification " y]); - endif - endif - %% Handle Y2K issues... - if (y < 100) - y = y + 1900; - if (y < P) - y = y + 100; - endif - endif - - if (ischar(m)) - m_num = str2num(m); - if (isempty(m_num)) - m = strmatch(m, tolower(__month_names)); - else - m = m_num; - endif - if (isempty(m)) - error(["datesplit: Invalid month specification"]); - endif - endif - - if (ischar(d)) - d = str2num(d); - if (isempty(d)) - error(["datesplit: Invalid day specification " d]); - endif - endif - - if (ischar(h)) - h = str2num(h); - if (isempty(h)) - error(["datesplit: Invalid hour specification " h]); - elseif ((ap(2) == "M") && (h > 12)) - error(["datesplit: Invalid hour specification, AM or PM specified but" - "hour is greater than 12."]); - endif - - if (strcmpi(ap, "PM") && (h < 12)) - h = h + 12; - elseif (strcmpi(ap, "AM") && (h == 12)) - h = 0; - endif - endif - - if (ischar(mi)) - mi = str2num(mi); - if (isempty(mi) || (mi > 59)) - error(["datesplit: Invalid minute specification " mi]); - endif - endif - - if (ischar(s)) - s = str2num(s); - if (isempty(s) || (s > 59)) - error(["datesplit: Invalid second specification " s]); - endif - endif - - if (nargout <= 1) - y = [y, m, d, h, mi, s]; - endif - -endfunction - -# wrapper around Octave's regexp -# compatible with octave-forge's regexp - -function varargout = of_regexp(pattern,string) - [S, E, TE, M, T, NM] = regexp(string,pattern); - varargout{1} = S; - - # return sub-strings if match - if (S) - for i=2:nargout - varargout{i} = T{1}{i-1}; - end - else - for i=2:nargout - varargout{i} = []; - end - end -endfunction - - -%!shared nowvec -%! nowvec=datevec(now); % Some tests could fail around midnight! -%!assert (datevec("07-Sep-2000 15:38:09"),[2000,9,7,15,38,9]); -%!assert (datevec("07-Sep-2000"),[2000,9,7,0,0,0]); -%!#ambiguous assert (datevec("09/07/00"),[2000,9,7,0,0,0]); -%!assert (datevec("Sep"),[nowvec(1),9,1,0,0,0]); -%!#ambiguous assert (datevec("09/13"),[nowvec(1),9,13,0,0,0]); -%!assert (datevec("2000"),[2000,1,1,0,0,0]); -%!assert (datevec("Sep00"),[2000,9,1,0,0,0]); -%!assert (datevec("15:38:09"),[nowvec(1:3),15,38,9]); -%!assert (datevec("03:38:09 PM"),[nowvec(1:3),15,38,9]); -%!assert (datevec("15:38"),[nowvec(1:3),15,38,0]); -%!assert (datevec("3:38 PM"),[nowvec(1:3),15,38,0]); -%!assert (datevec("Q3-00"),[2000,9,30,23,59,59]); -%!assert (datevec("Mar.03.1962 13:53:06"),[1962,3,3,13,53,6]); -%!assert (datevec("03/13/1962"),[1962,3,13,0,0,0]); -%!assert (datevec("1995/03/13"),[1995,3,13,0,0,0]); -%!assert (datevec("Q4-2132"),[2132,12,31,23,59,59]); -%!assert (datevec("Mar2047"),[2047,3,1,0,0,0]); -%!assert (datevec("20470313"),[2047,3,13,0,0,0]); -%!assert (datevec("20470313T132603"),[2047,3,13,13,26,3]); -%!assert (datevec("1047-03-13 13:26:03"),[1047,3,13,13,26,3]);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main/time/inst/datesplit.m Sun Aug 20 14:26:40 2006 +0000 @@ -0,0 +1,480 @@ +## Copyright (C) 2001 Bill Denney <bill@givebillmoney.com> +## +## This program 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 of the License, or +## (at your option) any later version. +## +## This program 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 this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## @deftypefn {Function File} {Y =} datesplit(date, P) +## @deftypefnx {Function File} {[Y,M,D,h,m,s] =} datesplit(date, P) +## Split a date string into the Year, Month, Day, hour, minute, and +## second. This routine tries to be as forgiving as possible to the +## date input while requiring that the date is not ambiguous. +## +## Anywhere possible where it would not be ambiguous, efforts were made +## to make times possible with seconds and AM/PM as optional. Also, +## along the same lines, where possible, commas were allowed with +## spaces, and the year/month/day separators were allowed as period (.), +## slash (/), and dash (-). Not all format possibilities are shown in +## the following table, but a date like @code{dd-mmm-yyyy HH:MM:SS} is +## parsed just as well as @code{d/mmm.yyyy, ,H:MM, AM}. +## +## Supported @code{date} formats include (the same as datestr): +## @multitable @columnfractions 0.1 0.45 0.45 +## @item @strong{Code} @tab @strong{Format} @tab @strong{Example} +## @item 0 @tab dd-mmm-yyyy HH:MM:SS @tab 07-Sep-2000 15:38:09 +## @item 1 @tab dd-mmm-yyyy @tab 07-Sep-2000 +## @item 2 @tab mm/dd/yy @tab 09/07/00 +## @item 3 @tab mmm @tab Sep +## @item 6 @tab mm/dd @tab 09/13 +## @item 10 @tab yyyy @tab 2000 +## @item 12 @tab mmmyy @tab Sep00 +## @item 13 @tab HH:MM:SS @tab 15:38:09 +## @item 14 @tab HH:MM:SS PM @tab 03:38:09 PM +## @item 15 @tab HH:MM @tab 15:38 +## @item 16 @tab HH:MM PM @tab 03:38 PM +## @item 17 @tab QQ-YY @tab Q3-00 +## @item 19 @tab dd/mm @tab 13/03 +## @item 20 @tab dd/mm/yy @tab 13/03/95 +## @item 21 @tab mmm.dd.yyyy HH:MM:SS @tab Mar.03.1962 13:53:06 +## @item 22 @tab mmm.dd.yyyy @tab Mar.03.1962 +## @item 23 @tab mm/dd/yyyy @tab 03/13/1962 +## @item 24 @tab dd/mm/yyyy @tab 12/03/1962 +## @item 25 @tab yy/mm/dd @tab 95/03/13 +## @item 26 @tab yyyy/mm/dd @tab 1995/03/13 +## @item 27 @tab QQ-YYYY @tab Q4-2132 +## @item 28 @tab mmmyyyy @tab Mar2047 +## @item 29 @tab yyyymmdd @tab 20470313 +## @item 30 @tab yyyymmddTHHMMSS @tab 20470313T132603 +## @item 31 @tab yyyy-mm-dd HH:MM:SS @tab 1047-03-13 13:26:03 +## @end multitable +## +## The parameter @code{P} is needed to convert date strings with 2 digit +## years into dates with 4 digit years. 2 digit years are assumed to be +## between @code{P} and @code{P+99}. If @code{P} is not given then the +## current year - 50 is used, so that dates are centered on the present. +## For birthdates, you would want @code{P} to be current year - 99. For +## appointments, you would want @code{P} to be current year. +## +## This function makes no strong attempt to verify the accuracy of the +## numbers that it returns in that it doesn't (currently) check to see +## that you're not trying to use the date Feb 30. When applicable, it +## tries to make your input work, though. It will try to determine if +## you're using the date "03/13/95" that the date is "March 13, 1995", +## but if there is doubt, datesplit will return an error instead of +## trying to guess the wrong value. +## +## @seealso{date,clock,now,datestr,datenum,calendar,weekday} +## @end deftypefn + +## TODO: +## * Some formats are ambiguous. Allow the user to specify the format +## to remove ambiguity. +## * Validate the dates. +## * Possible bug (after dates are validated): There are times where +## the year is assumed, Feb 29 may be a valid date, but with the +## assumed year, it may become invalid. +## * Internationalize. Not all months use the English system. +## * Vectorize. That requires vectorization of regexp though... + +## Author: Bill Denney <bill@givebillmoney.com> + +function [y, m, d, h, mi, s] = datesplit(ds, P) + + if nargin < 2 + P = []; + endif + + today = datevec(now); + + if (isempty(P)) + P = today(1)-50; + endif + + global __month_names = ["Jan";"Feb";"Mar";"Apr";"May";"Jun";... + "Jul";"Aug";"Sep";"Oct";"Nov";"Dec"]; + global __day_names = ["Sun";"Mon";"Tue";"Wed";"Thu";"Fri";"Sat"]; + global __time_names = ["AM";"PM"]; + + if (iscellstr(ds)) + ds = ds{1}; + endif + ds = tolower(deblank(ds)); + + if (nargin < 1) + error("datesplit: no input arguments"); + elseif (nargin == 1) + fmt = []; + endif + %% we have to determine the format, this could be error prone + + ## format 0 dd-mmm-yyyy HH:MM:SS e.g. 07-Sep-2000 15:38:09 + [match, d, m, y, h, mi, s, ap] = \ + of_regexp("^(3[01]|[0-2]?[0-9])[-./]([a-z]{3})[-./]([0-9]{4})[, ]+(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds); + + ## format 21 mmm.dd.yyyy HH:MM:SS e.g. Mar.03.1962 13:53:06 + if (isempty(match)) + [match, m, d, y, h, mi, s, ap] = \ + of_regexp("^([a-z]{3})[-./](3[01]|[0-2]?[0-9])[-./]([0-9]{4})[, ]+(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds); + endif + + ## format 31 yyyy-mm-dd HH:MM:SS e.g. 2004-03-13 13:26:03 + if (isempty(match)) + [match, y, m, d, h, mi, s, ap] = \ + of_regexp("^([0-9]{4})[-./](1[012]|0?[0-9])[-./](3[01]|[0-2]?[0-9])[, ]+(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds); + endif + + ## format 30 yyyymmddTHHMMSS e.g. 20470313T132603 + if (isempty(match)) + [match, y, m, d, h, mi, s] = \ + of_regexp("^([0-9]{4})(1[012]|0[0-9])(3[01]|[012][0-9])t(2[0-3]|[01][0-9])([0-5][0-9])([0-5][0-9])$", ds); + ap = "NA"; + endif + + ## format 13 HH:MM:SS e.g. 15:38:09 + ## format 14 HH:MM:SS PM e.g. 03:38:09 PM + ## format 15 HH:MM e.g. 15:38 + ## format 16 HH:MM PM e.g. 03:38 PM + if (isempty(match)) + [match, h, mi, s, ap] = \ + of_regexp("^(2[0-3]|[01]?[0-9]):([0-5][0-9])(:[0-5][0-9]|)[, ]*([ap]m|)$", ds); + + if (! isempty(match)) + %% assume that it is as of today + y = today(1); + m = today(2); + d = today(3); + endif + endif + + ## format 1 dd-mmm-yyyy e.g. 07-Sep-2000 + if (isempty(match)) + [match, d, m, y] = \ + of_regexp("^(3[01]|[012]?[0-9])[-./]([a-z]{3})[-./]([0-9]{4})$", ds); + + if (! isempty(match)) + %% assume the beginning of the day + h = 0; + mi = 0; + s = 0; + ap = "NA"; + endif + endif + + ## format 22 mmm.dd.yyyy e.g. Mar.03.1962 + if (isempty(match)) + [match, m, d, y] = \ + of_regexp("^([a-z]{3})[-./](3[01]|[012]?[0-9])[-./]([0-9]{4})$", ds); + + if (! isempty(match)) + %% assume the beginning of the day + h = 0; + mi = 0; + s = 0; + ap = "NA"; + endif + endif + + ## format 2 mm/dd/yy e.g. 09/07/00 + ## format 23 mm/dd/yyyy e.g. 03/13/1962 + ## format 20 dd/mm/yy e.g. 13/03/95 + ## format 24 dd/mm/yyyy e.g. 12/03/1962 + ## format 25 yy/mm/dd e.g. 95/03/13 + ## format 26 yyyy/mm/dd e.g. 1995/03/13 + if (isempty(match)) + [match, d, m, y] = \ + of_regexp("^([0-9]{1,2}|[0-9]{4})[-./](3[01]|[012]?[0-9])[-./]([0-9]{1,2}|[0-9]{4})$", ds); + + if (! isempty(match)) + %% we have to determine if the date is unambiguous + d = str2num(d); + m = str2num(m); + y = str2num(y); + + if ((y == 0) || (y > 31)) + %% we've got the year correct + if ((m > 12) && (d < 13)) + %% we're operating on mm/dd/yyyy + tmp = m; + m = d; + d = tmp; + elseif ((m < 13) && (d > 12)) + %% it's fine + else + %% it's ambiguous + error(["datesplit: ambiguous date " ds]); + endif + elseif ((d == 0) || (d > 31)) + %% the day and the year need to be switched + tmp = y; + y = d; + d = tmp; + else + %% it's ambiguous + error(["datesplit: ambiguous date " ds]); + endif + + %% assume the beginning of the day + h = 0; + mi = 0; + s = 0; + ap = "NA"; + endif + + endif + + ## format 29 yyyymmdd e.g. 20470313 + if (isempty(match)) + [match, y, m, d] = \ + of_regexp("^([0-9]{4})(1[012]|0?[0-9])(3[01]|[012][0-9])$", ds); + %% I've never seen a date that has the year first that was not + %% yyyy/mm/dd, so I'm going to assume that it's unambiguous. + + if (! isempty(match)) + %% assume the beginning of the day + h = 0; + mi = 0; + s = 0; + ap = "NA"; + endif + endif + + ## format 17 QQ-YY e.g. Q3-00 + ## format 27 QQ-YYYY e.g. Q4-2132 + if (isempty(match)) + [match, q, y] = \ + of_regexp("^q([1-4])[-./]([0-9]{2}|[0-9]{4})$", ds); + if (! isempty(match)) + %% Assume that it's the end of the quarter + q = str2num(q); + m = 3*q; + dayopts = [31 30 30 31]; + d = dayopts(q); + + %% assume the end of the day + h = 23; + mi = 59; + s = 59; + ap = "NA"; + endif + endif + + ## format 28 mmmyyyy e.g. Mar2047 + ## format 12 mmmyy e.g. Sep00 + if (isempty(match)) + [match, m, y] = \ + of_regexp("^([a-z]{3})([0-9]{2}|[0-9]{4})$", ds); + if (! isempty(match)) + %% assume the beginning of the month + d = 1; + h = 0; + mi = 0; + s = 0; + ap = "NA"; + endif + endif + + ## format 6 mm/dd e.g. 09/07 + ## format 19 dd/mm e.g. 13/03 + if (isempty(match)) + [match, m, d] = \ + of_regexp("^(3[01]|[012]?[0-9])[-./](3[01]|[012][0-9])$", ds); + + if (! isempty(match)) + m = str2num(m); + d = str2num(d); + + %% we have to determine if the date is unambiguous + if ((m > 12) && (d < 13)) + %% we're operating on mm/dd/yyyy + tmp = m; + m = d; + d = tmp; + elseif ((m < 13) && (d > 12)) + %% it's fine + else + %% it's ambiguous + error(["datesplit: ambiguous date " ds]); + endif + %% assume this year and the beginning of the day + y = today(1); + h = 0; + mi = 0; + s = 0; + ap = "NA"; + endif + endif + + ## format 10 yyyy e.g. 2000 + if (isempty(match)) + [match, y] = of_regexp("^([0-9]{4})$", ds); + + if (! isempty(match)) + %% assume the beginning of the year + m = 1; + d = 1; + h = 0; + mi = 0; + s = 0; + ap = "NA"; + endif + endif + + ## format 3 mmm e.g. Sep + if (isempty(match)) + m = strmatch(ds, tolower(__month_names)); + + if (! isempty(m)) + match = 1; + %% assuming the beginning of the month, this year + y = today(1); + d = 1; + h = 0; + mi = 0; + s = 0; + ap = "NA"; + endif + endif + + ## format 8 ddd e.g. Thu + %% People shouldn't use this function for something like this + + if (isempty(match)) + %% you mean I did all that work, and you still didn't use a valid + %% date? Darn you! + error(["datesplit: Unknown date format " ds]); + endif + + if (! isempty(match)) + if isempty(s) + s = 0; + elseif (ischar(s) && (1 == findstr(s,":"))) + s = s(2:3); + endif + if isempty(ap) + ap = "NA"; + endif + endif + + %% start converting the date from characters to numbers + if (ischar(y)) + y = str2num(y); + if (isempty(y)) + error(["datesplit: Invalid year specification " y]); + endif + endif + %% Handle Y2K issues... + if (y < 100) + y = y + 1900; + if (y < P) + y = y + 100; + endif + endif + + if (ischar(m)) + m_num = str2num(m); + if (isempty(m_num)) + m = strmatch(m, tolower(__month_names)); + else + m = m_num; + endif + if (isempty(m)) + error(["datesplit: Invalid month specification"]); + endif + endif + + if (ischar(d)) + d = str2num(d); + if (isempty(d)) + error(["datesplit: Invalid day specification " d]); + endif + endif + + if (ischar(h)) + h = str2num(h); + if (isempty(h)) + error(["datesplit: Invalid hour specification " h]); + elseif ((ap(2) == "M") && (h > 12)) + error(["datesplit: Invalid hour specification, AM or PM specified but" + "hour is greater than 12."]); + endif + + if (strcmpi(ap, "PM") && (h < 12)) + h = h + 12; + elseif (strcmpi(ap, "AM") && (h == 12)) + h = 0; + endif + endif + + if (ischar(mi)) + mi = str2num(mi); + if (isempty(mi) || (mi > 59)) + error(["datesplit: Invalid minute specification " mi]); + endif + endif + + if (ischar(s)) + s = str2num(s); + if (isempty(s) || (s > 59)) + error(["datesplit: Invalid second specification " s]); + endif + endif + + if (nargout <= 1) + y = [y, m, d, h, mi, s]; + endif + +endfunction + +# wrapper around Octave's regexp +# compatible with octave-forge's regexp + +function varargout = of_regexp(pattern,string) + [S, E, TE, M, T, NM] = regexp(string,pattern); + varargout{1} = S; + + # return sub-strings if match + if (S) + for i=2:nargout + varargout{i} = T{1}{i-1}; + end + else + for i=2:nargout + varargout{i} = []; + end + end +endfunction + + +%!shared nowvec +%! nowvec=datevec(now); % Some tests could fail around midnight! +%!assert (datevec("07-Sep-2000 15:38:09"),[2000,9,7,15,38,9]); +%!assert (datevec("07-Sep-2000"),[2000,9,7,0,0,0]); +%!#ambiguous assert (datevec("09/07/00"),[2000,9,7,0,0,0]); +%!assert (datevec("Sep"),[nowvec(1),9,1,0,0,0]); +%!#ambiguous assert (datevec("09/13"),[nowvec(1),9,13,0,0,0]); +%!assert (datevec("2000"),[2000,1,1,0,0,0]); +%!assert (datevec("Sep00"),[2000,9,1,0,0,0]); +%!assert (datevec("15:38:09"),[nowvec(1:3),15,38,9]); +%!assert (datevec("03:38:09 PM"),[nowvec(1:3),15,38,9]); +%!assert (datevec("15:38"),[nowvec(1:3),15,38,0]); +%!assert (datevec("3:38 PM"),[nowvec(1:3),15,38,0]); +%!assert (datevec("Q3-00"),[2000,9,30,23,59,59]); +%!assert (datevec("Mar.03.1962 13:53:06"),[1962,3,3,13,53,6]); +%!assert (datevec("03/13/1962"),[1962,3,13,0,0,0]); +%!assert (datevec("1995/03/13"),[1995,3,13,0,0,0]); +%!assert (datevec("Q4-2132"),[2132,12,31,23,59,59]); +%!assert (datevec("Mar2047"),[2047,3,1,0,0,0]); +%!assert (datevec("20470313"),[2047,3,13,0,0,0]); +%!assert (datevec("20470313T132603"),[2047,3,13,13,26,3]); +%!assert (datevec("1047-03-13 13:26:03"),[1047,3,13,13,26,3]);