Modifying timezone of a POSIXct object without changing the display

后端 未结 3 434
无人及你
无人及你 2021-02-01 23:45

I have a POSIXct object and would like to change it\'s tz attribute WITHOUT R to interpret it (interpret it would mean to change how the datetime is di

相关标签:
3条回答
  • 2021-02-02 00:14

    EDITED:

    My previous solution was passing a character value to origin (i.e.origin="1970-01-01"). That only worked here because of a bug (#PR14973) that has now been fixed in R-devel.

    origin was being coerced to POSIXct using the tz argument of the as.POSIXct call, and not "GMT" as it was documented to do. The behavior has been changed to match the documentation which, in this case, means that you have to specify your timezone for both the origin and the as.POSIXct call.

    datetime
    #[1] "2011-01-01 12:32:23.233 GMT"
    as.POSIXct(as.numeric(datetime), origin=as.POSIXct("1970-01-01", tz="Europe/Paris"),
               tz="Europe/Paris")
    #[1] "2011-01-01 12:32:23.233 CET"
    

    This will also works in older versions of R.

    0 讨论(0)
  • 2021-02-02 00:19

    To change the tz attribute of a POSIXct variable it is not best practice to convert to character or numeric and then back to POSIXct. Instead you could use the force_tz function of the lubridate package

    library(lubridate)
    
    datetime2 <- force_tz(datetime, tzone = "CET")
    datetime2
    attributes(datetime2)
    
    0 讨论(0)
  • 2021-02-02 00:29

    An alternative to the lubridate package is via conversion to and back from character type:

    recastTimezone.POSIXct <- function(x, tz) return(
      as.POSIXct(as.character(x), origin = as.POSIXct("1970-01-01"), tz = tz))
    

    (Adapted from GSee's answer)

    Don't know if this is efficient, but it would work for time zones with daylight savings.

    Test code:

    x <- as.POSIXct('2003-01-03 14:00:00', tz = 'Etc/UTC')
    x
    recastTimezone.POSIXct(x, tz = 'Australia/Melbourne')
    

    Output:

    [1] "2003-01-03 14:00:00 UTC"
    [1] "2003-01-03 14:00:00 AEDT" # Nothing is changed apart from the time zone.
    

    Output if I replaced as.character() by as.numeric() (as GSee had done):

    [1] "2003-01-03 14:00:00 UTC"
    [1] "2003-01-03 15:00:00 AEDT" # An hour is added.
    
    0 讨论(0)
提交回复
热议问题