From lorenz at usgs.gov  Tue Dec  8 14:31:57 2015
From: lorenz at usgs.gov (Lorenz, David)
Date: Tue, 8 Dec 2015 07:31:57 -0600
Subject: [Rd] inconsistency in POSIXlt
In-Reply-To: <CADwqtCNMA6VS0u7si5SwpHVEF_Jm7N-EZDAYQmLqzOximthsZA@mail.gmail.com>
References: <CALxY2Lc1vNT_92fHid7bPmLyd-twYrjRbfBqV6xf7=WctW=omw@mail.gmail.com>
	<CADwqtCNMA6VS0u7si5SwpHVEF_Jm7N-EZDAYQmLqzOximthsZA@mail.gmail.com>
Message-ID: <CALxY2LeC=oti8aNggUqm831Jm7UJqwu4wv-NbTujw1M3uHt8Lw@mail.gmail.com>

Gabriel,
  Thanks. I'm just frustrated by the inconsistencies in what I see in
POSIXlt. I'm not even sure what the tzone attribute does. Here's an example
that show behavior different from POSIXct.

> tl <- as.POSIXlt("2001-04-05 12:00", tz="America/Chicago")
> tl
[1] "2001-04-05 12:00:00 CDT"
> attr(tl, "tzone")
[1] "America/Chicago"
> attr(tl, "tzone") <- "America/Denver"
> tl
[1] "2001-04-05 12:00:00 CDT"
> tc <- as.POSIXct("2001-04-05 12:00", tz="America/Chicago")
> tc
[1] "2001-04-05 12:00:00 CDT"
> attr(tc, "tzone")
[1] "America/Chicago"
> attr(tc, "tzone") <- "America/Denver"
> tc
[1] "2001-04-05 11:00:00 MDT"

  From what I can see, changing the tzone attribute does nothing to the
display. But it does take effect when converting to POSIXct:

> as.POSIXct(tl)
[1] "2001-04-05 12:00:00 MDT"

  I think that was expected, knowing that POSIXlt is specifically local
time and if the tzone says Mountain time, then report in Mountain time. But
then what useful information is in the zone component in POSIXlt.



On Mon, Dec 7, 2015 at 3:23 PM, Gabriel Becker <gmbecker at ucdavis.edu> wrote:

> David,
>
> I didn't have time to dig through the code completely, but those other two
> are being set automatically in the C code as far as I can tell, in
> particular in the code
>
>     // localtime may change tzname.
>     if (isgmt) {
> 	PROTECT(tzone = mkString(tz));
>     } else {
> 	PROTECT(tzone = allocVector(STRSXP, 3));
> 	SET_STRING_ELT(tzone, 0, mkChar(tz));
> 	SET_STRING_ELT(tzone, 1, mkChar(R_tzname[0]));
> 	SET_STRING_ELT(tzone, 2, mkChar(R_tzname[1]));
>     }
>
>
> In the file https://svn.r-project.org/R/trunk/src/main/datetime.c (function do_asPOSIXlt)
>
> R_tzname is an extern char pointer. I can't say exactly where it is populated, but the code assumes it will be and that it will take care of what passing a length 3 vector would.
>
> Also, note that AFAICT the second and third are not freeform text, only very specific values are valid.
>
> Long story short, I think the answer is R doesn't let you do that because it takes care of it for you. (Unless someone more familiar with date handling in R pops in and points out how I've completely missed something).
>
> Best,
>
> ~G
>
>
> --
> Gabriel Becker, PhD
> Associate Scientist (Bioinformatics)
> Genentech Research
>

	[[alternative HTML version deleted]]



[Rd] inconsistency in POSIXlt
Lorenz, David