为什么纪元日期是正确的,但不能作为POSIXct对象的偏移量?

时间:2012-01-05 23:50:10

标签: r date posix epoch posixct

我有一个POSIXct对象的向量:

> dates <- seq(as.POSIXct("2004-01-01", tz="EST"), as.POSIXct("2004-01-02", tz="EST"), as.difftime(6, units="hours"))
> dates
[1] "2004-01-01 00:00:00 EST" "2004-01-01 06:00:00 EST"
[3] "2004-01-01 12:00:00 EST" "2004-01-01 18:00:00 EST"
[5] "2004-01-02 00:00:00 EST"

我创建了一个epoch变量,为UNIX epoch定义了一个POSIXct对象:

> epoch <- strptime("1970-01-01 00:00:00", "%Y-%m-%d %H:%M:%S", tz="EST")
> class(epoch)
[1] "POSIXct" "POSIXt"  
> epoch
[1] "1970-01-01 EST"

然后我遍历dates向量并打印出与epoch偏移的值:

> for (d in dates) { print(as.POSIXct(d, origin=epoch, tz="EST")) }
[1] "2004-01-01 05:00:00 EST"
[1] "2004-01-01 11:00:00 EST"
[1] "2004-01-01 17:00:00 EST"
[1] "2004-01-01 23:00:00 EST"
[1] "2004-01-02 05:00:00 EST"

dates中的值与相对于epoch的相同值的表示之间似乎存在五小时的偏移误差。

EST和UTC之间存在+5小时的差异,但我使用epoch选项为tz指定了EST时区。打印出epoch,似乎没有时间信息,只有日期。

strptimeas.POSIXct是否存在错误,或者我是否计算错误或错误地生成epoch

1 个答案:

答案 0 :(得分:1)

For loop style has effect on class coercion?的答案所述,在for循环中,您的日期会转换为数字。这是自“标准”时代以来的秒数。这包括EST和UTC之间的5小时转换。这是作为epoch的偏移量添加的。查看as.POSIXct.numeric的来源。

以下方法有效,因为它设置的日期将是转换为数字时的正确秒数。

dates <- seq(as.POSIXct("2004-01-01", tz="UTC"), 
             as.POSIXct("2004-01-02", tz="UTC"), 
             as.difftime(6, units="hours"))
epoch <- strptime("1970-01-01 00:00:00", "%Y-%m-%d %H:%M:%S", tz="EST")

for (d in dates) { print(as.POSIXct(d, origin=epoch, tz="EST")) }

哪个给出了

[1] "2004-01-01 EST"
[1] "2004-01-01 06:00:00 EST"
[1] "2004-01-01 12:00:00 EST"
[1] "2004-01-01 18:00:00 EST"
[1] "2004-01-02 EST"