使用不同的时区将POSIXct转换为数字

6

我认为我可能不理解POSIXct的工作原理,或者其他方面出了问题。据我所知,它是自纪元以来的秒数,其中纪元是标准时间,如1970-01-01 GMT。

我获取了两个POSIXct时间,一个在EST时区,一个在PST时区,它们表示相同的绝对时间。然而,当我将它们转换为数字值时,结果却不同... 有人能指出我做错了什么吗?

> 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

这是我的会话信息:

> 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

1
在开始使用POSIXct之前,请确保您的系统时区已经定义好。例如,您可以使用Sys.setenv(TZ='GMT')来完成这个步骤。 - Andy Clifton
2个回答

5
时区名称并不像您想象的那么简单。请参考http://en.wikipedia.org/wiki/Tz_database 了解背景知识,并查看http://en.wikipedia.org/wiki/List_of_tz_database_time_zones 获取使用的名称列表。到目前为止,最好的方法是使用tz = '国家/城市' 的表示法,并明确设置本地系统的时区。

所以,这里有一个脚本使用了两种不同的方法来编码时区:

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')

如果我们查看希望是PST的POSIXct值,我们会发现它们实际上有两个不同的值。从缩写开始 (tz ='PST'),你会得到这个:
> pst.abr
[1] "2011-01-10 06:45:00 UTC"
> as.numeric(pst.abr)
[1] 1294641900

您会发现,我们使用 tz='PST' 定义的数据实际上并不在 PST 时区,而是继承了系统的时区。

与我们使用国家/城市定义的数据进行比较:

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

因此,只有我们明确使用国家/城市信息编码的数据才具有正确的时区信息。

1
当我想到这个问题时,这真的很奇怪,因为我使用国家/城市符号编码的内容现在已经得到了正确的缩写。POSIXct让我感到困惑。 - Andy Clifton
谢谢。就是这样。最初我使用的是“US/Eastern”和“US/Pacific”,但由于它一直打印为EST/PST,所以在某个时候,我不经意间切换到了那些时区而没有太多考虑。 - vc273

3

这是因为在您的系统上,tz="PST" 的含义与您想象的不同。在Linux上,您可能会在/usr/share/zoneinfo/zone.tab中找到可用完整名称的列表。对于我的Linux发行版,使用tz='America/Los_Angeles'即可。

如果键入?Sys.timezone,您将找到更多信息。


此外,EDT 也是模棱两可的,为了避免与加拿大和对极地区的模仿者混淆,应该使用 'EST5EDT'。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接