jbrzusto at fastmail.fm
2007-Mar-21 14:58 UTC
[Rd] bug and patch: strptime first-of-month error in (possibly unsupported use of) "%j" format (PR#9577)
Full_Name: John Brzustowski Version: R-devel-trunk OS: linux (problem under Windows too) Submission from: (NULL) (74.101.124.238) (This bug was discovered by Phil Taylor, Acadia University.) I'm not sure from reading the documentation whether strptime(x, "%j") is meant to be supported, but if so, there is a bug which prevents it from working on the first day of months after January:> strptime(31:33, "%j")[1] "2007-01-31" NA "2007-02-02" # the full extent of R's taunting strptime(1 + cumsum(c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30)), "%j") [1] NA NA NA NA NA NA NA NA NA NA NA>The problem is an edge-case comparison in datetime.c:glibc_fix(). This generates a date like "Jan 32", which validate_tm() catches and NAs. (Values of field tm->tm_yday start at 0, not 1.) ================================================================================PATCH: --- R/src/main/datetime.c (revision 40860) +++ R/src/main/datetime.c (working copy) @@ -796,7 +796,7 @@ if(tm->tm_yday != NA_INTEGER) { /* since we have yday, let that take precedence over mon/mday */ int yday = tm->tm_yday, mon = 0; - while(yday > (tmp = days_in_month[mon] + + while(yday >= (tmp = days_in_month[mon] + ((mon==1 && isleap(1900+tm->tm_year))? 1 : 0))) { yday -= tmp; mon++;
Prof Brian Ripley
2007-Mar-22 11:52 UTC
[Rd] (PR#9577) bug and patch: strptime first-of-month error in (possibly unsupported use of) "%j" format
The aim was to fix up some unsupported cases in glibc and related implementations, and clearly we only managed to do so partially. Thank you: I've applied the change (and a regression test) to 2.5.0-to-be. On Wed, 21 Mar 2007, jbrzusto at fastmail.fm wrote:> Full_Name: John Brzustowski > Version: R-devel-trunk > OS: linux (problem under Windows too) > Submission from: (NULL) (74.101.124.238) > > > (This bug was discovered by Phil Taylor, Acadia University.) > I'm not sure from reading the documentation whether strptime(x, "%j") is meant > to be supported, but if so, there is a bug which prevents it from working on the > first day of months after January: > >> strptime(31:33, "%j") > [1] "2007-01-31" NA "2007-02-02" > > # the full extent of R's taunting > strptime(1 + cumsum(c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30)), "%j") > [1] NA NA NA NA NA NA NA NA NA NA NA >> > > The problem is an edge-case comparison in datetime.c:glibc_fix(). This > generates a date like "Jan 32", which validate_tm() catches and NAs. > (Values of field tm->tm_yday start at 0, not 1.) > ================================================================================> PATCH: > > --- R/src/main/datetime.c (revision 40860) > +++ R/src/main/datetime.c (working copy) > @@ -796,7 +796,7 @@ > if(tm->tm_yday != NA_INTEGER) { > /* since we have yday, let that take precedence over mon/mday */ > int yday = tm->tm_yday, mon = 0; > - while(yday > (tmp = days_in_month[mon] + > + while(yday >= (tmp = days_in_month[mon] + > ((mon==1 && isleap(1900+tm->tm_year))? 1 : 0))) { > yday -= tmp; > mon++; > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595