我试图在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.Posixct
和as.Posixlt
使用Sys.Date()
返回两个不同的值,为什么在应用force_tz
的{{1}}后,差异为8小时?
答案 0 :(得分:2)
与以往一样,debugonce
是你的朋友。运行debugonce(force_tz)
,您可以看到输出的差异来自force_tz
首先检查分支is.POSIXct(time)
的时间点(在这种情况下应用了默认的tzone = ""
);在POSIXlt
案例中,默认分支被点击,其中as.POSIXct
适用于time
和tz(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"