>>>>> Ben Bolker 
>>>>>     on Wed, 14 Jan 2026 18:21:37 -0500 writes:

    > It seems not so much non-deterministic, as different on the first vs. 
    > following invocations ...

Thank you, Ben!   Indeed, I can confirm "deterministic",
but even stranger (see below)..

    > $ cat tz.R
    > Sys.setenv(TZ="Europe/London")
    > for (i in 1:10) {
    > print(attr(as.POSIXlt(as.numeric(1:10)), 'tzone'))

    > $ Rscript  tz.R
    > [1] "Europe/London" "GMT"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"

    > $ Rscript  tz.R
    > [1] "Europe/London" "GMT"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"

    > $ Rscript  tz.R
    > [1] "Europe/London" "GMT"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"
    > [1] "Europe/London" "BST"           "BST"


    > On 1/14/26 17:47, Michael Chirico via R-devel wrote:
    >> As a test case I have code running 'as.POSIXlt(1:10)', which can
    >> unfortunately produce non-deterministic results:
    >> 
    >> TZ=Europe/London R
    >> attr(as.POSIXlt(as.numeric(1:10)), 'tzone')
    >> # [1] "Europe/London" "GMT"           "BST"
    >> attr(as.POSIXlt(as.numeric(1:10)), 'tzone')
    >> # [1] "Europe/London" "BST"           "BST"
    >> 
    >> Is this intended behavior? I don't see this possibility described in
    >> any of ?DateTimeClasses, ?strptime, ?timezones, or ?as.POSIXlt. Some
    >> caching is mentioned around .sys.timezone, but the above snippets
    >> don't have any relationship that I can see.

This is true.  I've also checked   .sys.timezone and not seen
anything.

For those (like me who did not know):
BST today is "British Summer Time"  (and *not* "British Standard
Time" as I first guessed).

For the example  as.POSIXlt(1) , it is clearly wrong as  Jan 1  is
not summer time in London ... OTOH, at that time maybe there was
confusion .. (?).
I see that indeed  `gmtoff = 3600` which would also say that
London was off UTC by  1 hour, as in "real summer time"...

The behaviour we see is actually much older than .sys.timezone
(which exists only since R 4.0.0); 
The format()ing  / print()ing of such times also changes, but
seems to be *correct* (depending on "Summer" / "Winter") and
doing so +- correctly (see below).. whereas indeed there must be C level
state variable which is at the first call and then used...

You can use my R script tz.R  (which I also attach with MIME type text/plain)
and also provide, to be safe (from E-mail mangling etc):
Alternatively use
   https://people.math.ethz.ch/~maechler/R/tz/tz.R
e.g.,    

  download.file("https://people.math.ethz.ch/~maechler/R/tz/tz.R";,
                destfile="/tmp/tz.R")

When I run it with a close to 10 year old version of R 
via
      `R-3.3.0 RHOME`/bin/Rscript --vanilla tz.R
I get 

R version 3.3.0 (2016-05-03)
"Non-deterministic" POSIXlt tzone in Europe/London around UTC 0
Europe/London
-------- no print(), only cat(..  format(*) ..) : -------------------------
-2, lt(5.3949e+06): 1970-03-04 11:34:40 BST | GMT BST =>> changed to BST BST
-1, lt(5.5123e+06): 1970-03-05 20:12:20 BST | BST BST
 0, lt(     6e+06): 1970-03-11 11:40:00 BST | BST BST
 1, lt(6.5123e+06): 1970-03-17 09:59:00 BST | BST BST
 2, lt(7.3949e+06): 1970-03-27 15:08:00 BST | BST BST
 3, lt(1.0499e+07): 1970-05-02 13:17:00 BST | BST BST
 4, lt(2.0636e+07): 1970-08-27 21:16:00 BST | BST BST
 5, lt(4.7062e+07): 1971-06-29 17:55:00 BST | BST BST
 6, lt(1.0496e+08): 1973-04-29 19:24:00 BST | BST BST =>> changed to GMT BST
 7, lt( 2.169e+08): 1976-11-15 09:33:00 GMT | GMT BST
 8, lt(4.1436e+08): 1983-02-17 19:12:00 GMT | GMT BST
 9, lt(7.3916e+08): 1993-06-04 04:31:00 BST | GMT BST
10, lt( 1.245e+09): 2009-06-14 18:20:00 BST | GMT BST
 9, lt(7.3916e+08): 1993-06-04 04:31:00 BST | GMT BST
 8, lt(4.1436e+08): 1983-02-17 19:12:00 GMT | GMT BST
 7, lt( 2.169e+08): 1976-11-15 09:33:00 GMT | GMT BST
 6, lt(1.0496e+08): 1973-04-29 19:24:00 BST | GMT BST
 5, lt(4.7062e+07): 1971-06-29 17:55:00 BST | GMT BST =>> changed to BST BST
 4, lt(2.0636e+07): 1970-08-27 21:16:00 BST | BST BST
 3, lt(1.0499e+07): 1970-05-02 13:17:00 BST | BST BST
 2, lt(7.3949e+06): 1970-03-27 15:08:00 BST | BST BST
 1, lt(6.5123e+06): 1970-03-17 09:59:00 BST | BST BST
 0, lt(     6e+06): 1970-03-11 11:40:00 BST | BST BST
-1, lt(5.5123e+06): 1970-03-05 20:12:20 BST | BST BST
-2, lt(5.3949e+06): 1970-03-04 11:34:40 BST | BST BST
$

and this *identical* (apart from the R.version.string at the start)
to running it in my current version of R-devel and also to
running R version 3.1.0 (2014-04-10).

It seems the "state changing" effect happens
indicated by     "==>  changed ..."    above only when the
current time is relatively close to 1970-01-01 (the POSIXct time origin).

So, at least this is not at all a new problem,
*BUT* it also not "infinitely old":
It does *not* happen for me, with  R 3.0.0, where I see

$ `R-3.0.0 RHOME`/bin/Rscript --vanilla tz.R
R version 3.0.0 (2013-04-03)
"Non-deterministic" POSIXlt tzone in Europe/London around UTC 0
Europe/London
-------- no print(), only cat(..  format(*) ..) : -------------------------
-2, lt(5.3949e+06): 1970-03-04 11:34:40 BST | BST BST
-1, lt(5.5123e+06): 1970-03-05 20:12:20 BST | BST BST
 0, lt(     6e+06): 1970-03-11 11:40:00 BST | BST BST
 1, lt(6.5123e+06): 1970-03-17 09:59:00 BST | BST BST
 2, lt(7.3949e+06): 1970-03-27 15:08:00 BST | BST BST
 3, lt(1.0499e+07): 1970-05-02 13:17:00 BST | BST BST
 4, lt(2.0636e+07): 1970-08-27 21:16:00 BST | BST BST
 5, lt(4.7062e+07): 1971-06-29 17:55:00 BST | BST BST
 6, lt(1.0496e+08): 1973-04-29 19:24:00 BST | GMT BST
 7, lt( 2.169e+08): 1976-11-15 09:33:00 GMT | GMT BST
 8, lt(4.1436e+08): 1983-02-17 19:12:00 GMT | GMT BST
 9, lt(7.3916e+08): 1993-06-04 04:31:00 BST | GMT BST
10, lt( 1.245e+09): 2009-06-14 18:20:00 BST | GMT BST
 9, lt(7.3916e+08): 1993-06-04 04:31:00 BST | GMT BST
 8, lt(4.1436e+08): 1983-02-17 19:12:00 GMT | GMT BST
 7, lt( 2.169e+08): 1976-11-15 09:33:00 GMT | GMT BST
 6, lt(1.0496e+08): 1973-04-29 19:24:00 BST | GMT BST
 5, lt(4.7062e+07): 1971-06-29 17:55:00 BST | BST BST
 4, lt(2.0636e+07): 1970-08-27 21:16:00 BST | BST BST
 3, lt(1.0499e+07): 1970-05-02 13:17:00 BST | BST BST
 2, lt(7.3949e+06): 1970-03-27 15:08:00 BST | BST BST
 1, lt(6.5123e+06): 1970-03-17 09:59:00 BST | BST BST
 0, lt(     6e+06): 1970-03-11 11:40:00 BST | BST BST
-1, lt(5.5123e+06): 1970-03-05 20:12:20 BST | BST BST
-2, lt(5.3949e+06): 1970-03-04 11:34:40 BST | BST BST
$

(notably, no  "=>> changed to ...."  marks !)

The above is in the Linux default

  > sessionInfo()$tzcode
  [1] "system (glibc)"

OTOH, if using the R internal tzcode
[via     configure --with-internal-tzcode  ]
the above "=>> changed to ...."  marks do *not* appear and the
tzone entries shown above are "constant", always  " | GMT BST "
So, there is a problem with "system (glibc)"'s behaviour, or in
the logic of our interface to that..

.. and I am happy I see no changes to the C code (datetime.c) by me between
spring 2013 and 2014 , so chances are high that this time it was
not me ;-)  ... but yes, indeed, there were quite a few changes
there, also fixing problems with tzone
(svn rev 62314, *622,*623, 64233,..., 65798, 65159).

............

Ok, that's enough material for a new R Bugzilla PR ..

Martin

______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to