POSIXct to numeric using different timezones

posixct, r

Solution

Timezone names are not as simple as you would like. See http://en.wikipedia.org/wiki/Tz_database for background and http://en.wikipedia.org/wiki/List_of_tz_database_time_zones for a list of the names that are used. By far the best thing is to use the `tz = 'country / city'` notation and to explicitly set the time zone of the local system.

So, here's a script that uses two different methods to encode the time zone:

Sys.setenv(TZ='GMT')
pst.abr <- as.POSIXct('2011-01-10 06:45:00', tz = 'PST')
est.abr <- as.POSIXct('2011-01-10 09:45:00', tz = 'EST')
pst.country.city <- as.POSIXct('2011-01-10 06:45:00', tz = 'America/Los_Angeles')
est.country.city <- as.POSIXct('2011-01-10 09:45:00', tz = 'America/New_York')

If we look at the POSIXct values that we would have like to have been PST, we see that they actually have two different values. Starting with the abbreviation (`tz ='PST'`), you get this:

> pst.abr
[1] "2011-01-10 06:45:00 UTC"
> as.numeric(pst.abr)
[1] 1294641900

You see that the data we defined using `tz='PST'` isn't actually in the PST timezone, but has inherited the system's timezone.

Compare this to the data we defined using the country\city:

> as.numeric(pst.country.city)
[1] 1294670700
> pst.country.city
[1] "2011-01-10 06:45:00 PST"

So, only the data that we explicitly encode with country/city information has the correct timezone information.

Problem

I think I must not understand how POSIXct works, or something. As far as I understand, it is seconds since epoch, with epoch being a standard time like 1970-01-01 GMT. I take two POSIXct times one in EST one in PST that are the same absolute time. Yet, when I convert them to a numeric value, the result is different... Could anyone point me to what I am doing wrong? ``` > pst = as.POSIXct('2011-01-10 06:45:00', tz = 'PST') > est = as.POSIXct('2011-01-10 09:45:00', tz = 'EST') > as.numeric(pst) [1] 1294641900 > as.numeric(est) [1] 1294670700 ``` here is my session info: ``` > sessionInfo() R version 2.13.0 (2011-04-13) Platform: x86_64-unknown-linux-gnu (64-bit) locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=C LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=C\ LC_ADDRESS=C [10] LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C attached base packages: [1] grid stats graphics grDevices utils datasets methods base other attached packages: [1] RSQLite_0.9-4 snow_0.3-8 RMySQL_0.8-0 DBI_0.2-5 gtools_2.6.2 reshape2_1.1 ggplot2_0.8.9 proto_0.3-9.2 reshape_0.8.4 fTrading_2100.76 fBasics_\ 2110.79 MASS_7.3-12 [13] timeSeries_2130.92 timeDate_2131.00 plyr_1.7.1 loaded via a namespace (and not attached): [1] stringr_0.4 tools_2.13.0 ```

Original source