50

谁能告诉我为什么 R 在下面给出这样的结果:

> as.POSIXct("2013-01-01 08:00")
[1] "2013-01-01 08:00:00 HKT"
> as.Date(as.POSIXct("2013-01-01 08:00"))
[1] "2013-01-01"
> as.POSIXct("2013-01-01 07:00")
[1] "2013-01-01 07:00:00 HKT"
> as.Date(as.POSIXct("2013-01-01 07:00"))
[1] "2012-12-31"

不应该是2013-01-01在转换POSIXctDatefor之后2013-01-01 07:00,有什么办法可以将截止从08:00to更改00:00吗?

更新#1

我发现以下可以解决我的问题,但方式不太整洁

> as.Date(as.character(as.POSIXct("2013-01-01 07:00")))
[1] "2013-01-01"
4

3 回答 3

50

这里的问题是时区 - 你可以看到你在"HKT". 尝试:

as.Date(as.POSIXct("2013-01-01 07:00", 'GMT'))
[1] "2013-01-01"

来自?as.Date()

[" POSIXct" is] 通过忽略指定时区时间表示中的午夜之后的时间转换为天数,默认 UTC

于 2013-05-15T04:48:04.420 回答
33

使用时区参数as.Date

as.Date(as.POSIXct("2013-01-01 07:00",tz="Hongkong"))
#[1] "2012-12-31"

as.Date(as.POSIXct("2013-01-01 07:00",tz="Hongkong"),tz="Hongkong")
#[1] "2013-01-01"

事实上,我建议tz在使用日期时间转换函数时始终使用该参数。还有其他令人讨厌的惊喜,例如夏令时。

于 2013-05-15T07:03:31.393 回答
3

当同期 UTC 时间在您的 POSIXct 日期的午夜之前(您的第三个示例)或午夜之后,就会发生这种情况,如记录和先前解释的那样。要亲自查看数学,请as.Date.POSIXct在控制台上进行检查。默认下的数学tz="UTC"是清楚的。在非默认情况下,R 本质上调用as.Date.POSIXlt,并且date-travel不会发生。事实上,如果你从lt对象开始,你就不会遇到这个问题:

> as.Date(as.POSIXlt("2013-01-01 07:00", tz = "Hongkong"))  
[1] "2013-01-01"

最简单的解决方法是调用 as.Date withtz=""以强制使用较少违规的as.Date.POSIXlt算法:

> as.Date(as.POSIXct("2013-01-01 07:00"), tz = "")  
[1] "2013-01-01"
于 2019-02-19T20:25:10.987 回答