Liam,

I think I have failed to convey my main point in the last e-mail - which was 
that you want to parse the date/time in the timezone that you care about so in 
your example that would be

> foo <- as.Date(33874, origin = "1899-12-30")
> foo
[1] "1992-09-27"
> as.POSIXlt(as.character(foo), "Europe/Berlin")
[1] "1992-09-27 CEST"

I was explicitly saying that you do NOT want to simply change the time zone on 
POSIXlt objects as that won't work for reasons I explained - see my last e-mail.

Cheers,
Simon


> On 11/10/2022, at 6:31 AM, Liam Bailey <liam.bai...@liamdbailey.com> wrote:
> 
> Hi all,
> 
> Thanks Simon for the detailed response, that helps us understand a lot better 
> what’s going on! However, with your response in mind, we still encounter some 
> behaviour that we did not expect.
> 
> I’ve included another minimum reproducible example below to expand on the 
> situation. In this example, `foo` is a Date object that we generate from a 
> numeric input. Following your advice, `bar` is then a POSIXlt object where we 
> now explicitly define timezone using argument tz. However, even though we are 
> explicit about the timezone the POSIXlt that is generated is always in UTC. 
> This then leads to the issues outlined by Alexandre above, which we now 
> understand are caused by DST.
> 
> ``` r
> #Generate date from numeric
>     #Not possible to specify tz at this point
>     foo <- as.Date(33874, origin = "1899-12-30")
>     dput(foo)
> #> structure(8305, class = "Date")
>     
>     #Convert to POSIXlt specifying UTC timezone
>     bar <- as.POSIXlt(foo, tz = "UTC")
>     dput(bar)
> #> structure(list(sec = 0, min = 0L, hour = 0L, mday = 27L, mon = 8L, 
> #>     year = 92L, wday = 0L, yday = 270L, isdst = 0L), class = c("POSIXlt", 
> #> "POSIXt"), tzone = "UTC")
>     
>     #Convert to POSIXlt specifying Europe/Berlin.
>     #Time zone is still UTC
>     bar <- as.POSIXlt(foo, tz = "Europe/Berlin")
>     dput(bar)
> #> structure(list(sec = 0, min = 0L, hour = 0L, mday = 27L, mon = 8L, 
> #>     year = 92L, wday = 0L, yday = 270L, isdst = 0L), class = c("POSIXlt", 
> #> "POSIXt"), tzone = "UTC")
> ```
> 
> 
> We noticed that this occurs because the tz argument is not passed to 
> `.Internal(Date2POSIXlt())` inside `as.POSIXlt.Date()`.
> 
> Reading through the documentation for `as.POSIX*` we can see that this 
> behaviour is described:
> 
>       > “Dates without times are treated as being at midnight UTC.”
> 
> In this case, if we want to convert a Date object to POSIX* and specify a 
> (non-UTC) timezone would the best strategy be to first coerce our Date object 
> to character? Alternatively, `lubridate::as_datetime()` does seem to 
> recognise the tz argument and convert a Date object to POSIX* with non-UTC 
> time zone (see second example below). But it would be nice to know if there 
> are subtle differences between these two approaches that we should be aware 
> of.
> 
> ``` r
> foo <- as.Date(33874, origin = "1899-12-30")
> dput(foo)
> #> structure(8305, class = "Date")
> 
> #Convert to POSIXct specifying UTC timezone
> bar <- lubridate::as_datetime(foo, tz = "UTC")
> dput(as.POSIXlt(bar))
> #> structure(list(sec = 0, min = 0L, hour = 0L, mday = 27L, mon = 8L, 
> #>     year = 92L, wday = 0L, yday = 270L, isdst = 0L), class = c("POSIXlt", 
> #> "POSIXt"), tzone = "UTC")
> 
> #Convert to POSIXct specifying Europe/Berlin
> bar <- lubridate::as_datetime(foo, tz = "Europe/Berlin")
> dput(as.POSIXlt(bar))
> #> structure(list(sec = 0, min = 0L, hour = 0L, mday = 27L, mon = 8L, 
> #>     year = 92L, wday = 0L, yday = 270L, isdst = 1L, zone = "CEST", 
> #>     gmtoff = 7200L), class = c("POSIXlt", "POSIXt"), tzone = 
> c("Europe/Berlin", 
> #> "CET", "CEST"))
> ```
> 
> Thanks again for all your help.
> Alex & Liam
> 
>> On 10 Oct 2022, at 6:40 pm, Hadley Wickham <h.wick...@gmail.com> wrote:
>> 
>> On Sun, Oct 9, 2022 at 9:31 PM Jeff Newmiller <jdnew...@dcn.davis.ca.us> 
>> wrote:
>>> 
>>> ... which is why tidyverse functions and Python datetime handling irk me so 
>>> much.
>>> 
>>> Is tidyverse time handling intrinsically broken? They have a standard 
>>> practice of reading time as UTC and then using force_tz to fix the 
>>> "mistake". Same as Python.
>> 
>> Can you point to any docs that lead you to this conclusion so we can
>> get them fixed? I strongly encourage people to parse date-times in the
>> correct time zone; this is why lubridate::ymd_hms() and friends have a
>> tz argument.
>> 
>> Hadley
>> 
>> -- 
>> http://hadley.nz
> 

______________________________________________
R-package-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-package-devel

Reply via email to