Posixlt和Posixct中的系统日期

时间:2018-01-13 12:23:25

标签: r time posix lubridate

我试图在Posix时间使用Sys.Date()获取昨天的最后一分钟。

force_tz(as.POSIXlt(Sys.Date()-1), tz = 'America/New_York') + 86399
# [1] "2018-01-12 23:59:59 EST" 

CORRECT

force_tz(as.POSIXct(Sys.Date()-1), tz = 'America/New_York') + 86399
# [1] "2018-01-12 15:59:59 EST"

不正确

Sys.Date()
# [1] "2018-01-13"

为什么as.Posixctas.Posixlt使用Sys.Date()返回两个不同的值,为什么在应用force_tz的{​​{1}}后,差异为8小时?

1 个答案:

答案 0 :(得分:2)

与以往一样,debugonce是你的朋友。运行debugonce(force_tz),您可以看到输出的差异来自force_tz首先检查分支is.POSIXct(time)的时间点(在这种情况下应用了默认的tzone = "");在POSIXlt案例中,默认分支被点击,其中as.POSIXct适用于timetz(time)UTC表示POSIXlt ())用作时区。

这归结为一些微妙的事情;来自?as.POSIXlt.Date

  

没有时间的日期被视为在UTC午夜。

因此

tz(as.POSIXlt(Sys.Date()-1))
# [1] "UTC"

但是

tz(as.POSIXct(Sys.Date()-1))
# [1] ""

这是不可能的,但as.POSIXlt.Date不接受tz论证:

formals(as.POSIXlt.Date)
# $x
# $...

如果您想使用POSIXct,请参阅以下内容?

force_tz(as.POSIXct(sprintf('%s 00:00:00', Sys.Date())), 'America/New_York') - 1L
# [1] "2018-01-12 23:59:59 EST"