R: lubridate 的 dst() 没有按预期工作
R: lubridate's dst() not working as expected
我怀疑我在做一些非常愚蠢的事情,但我无法让 lubridate
中的 dst
函数按预期工作。
library(lubridate)
x <- c("2016-01-01", "2016-06-01")
dst(x) # Returns c(FALSE, TRUE)
dst(as.Date(x)) # Returns c(FALSE, FALSE)
两种情况下我期望的结果都是c(FALSE, TRUE)
。但是,如果我传递 dst
一个字符向量而不是 Date
对象,我只会得到预期的结果。我正在使用 OS X,我当前的时区是太平洋标准时间 (America/Los_Angeles
)。
dst()
调用一段代码,本质上是:
c(NA, FALSE, TRUE)[as.POSIXlt(x)$isdst + 2]
as.POSIXlt
默认为:
as.POSIXlt(x=, tz="")
...默认使用您的系统时区。因此,鉴于您在 L.A 中的位置,让我们看看:
as.POSIXlt(x, tz="America/Los_Angeles")
#[1] "2016-01-01 PST" "2016-06-01 PDT"
c(NA, FALSE, TRUE)[as.POSIXlt(x, tz="America/Los_Angeles")$isdst + 2]
#[1] FALSE TRUE
一切都很好。万岁。现在,让我们尝试 as.Date(x)
as.POSIXlt(as.Date(x))
#[1] "2016-01-01 UTC" "2016-06-01 UTC"
as.POSIXlt(as.Date(x), tz="America/Los_Angeles")
#[1] "2016-01-01 UTC" "2016-06-01 UTC"
哦哦。因此,as.POSIXlt
不能很好地处理 Date
对象,并且总是 returns UTC
而不是本地时区,并且似乎忽略了任何 tz=
参数。由于 UTC
不遵守任何夏令时,您最终总是会返回 FALSE
。
看R源码,好像是这样的。在https://svn.r-project.org/R/trunk/src/main/datetime.c中您可以找到:
# R call:
#> as.POSIXlt.Date
#function (x, ...)
#.Internal(Date2POSIXlt(x))
# source code:
#SEXP attribute_hidden do_D2POSIXlt(SEXP call, SEXP op, SEXP args, SEXP env)
#{
#...
setAttrib(ans, s_tzone, mkString("UTC"));
...作为 hard-coded 字符串。
我怀疑我在做一些非常愚蠢的事情,但我无法让 lubridate
中的 dst
函数按预期工作。
library(lubridate)
x <- c("2016-01-01", "2016-06-01")
dst(x) # Returns c(FALSE, TRUE)
dst(as.Date(x)) # Returns c(FALSE, FALSE)
两种情况下我期望的结果都是c(FALSE, TRUE)
。但是,如果我传递 dst
一个字符向量而不是 Date
对象,我只会得到预期的结果。我正在使用 OS X,我当前的时区是太平洋标准时间 (America/Los_Angeles
)。
dst()
调用一段代码,本质上是:
c(NA, FALSE, TRUE)[as.POSIXlt(x)$isdst + 2]
as.POSIXlt
默认为:
as.POSIXlt(x=, tz="")
...默认使用您的系统时区。因此,鉴于您在 L.A 中的位置,让我们看看:
as.POSIXlt(x, tz="America/Los_Angeles")
#[1] "2016-01-01 PST" "2016-06-01 PDT"
c(NA, FALSE, TRUE)[as.POSIXlt(x, tz="America/Los_Angeles")$isdst + 2]
#[1] FALSE TRUE
一切都很好。万岁。现在,让我们尝试 as.Date(x)
as.POSIXlt(as.Date(x))
#[1] "2016-01-01 UTC" "2016-06-01 UTC"
as.POSIXlt(as.Date(x), tz="America/Los_Angeles")
#[1] "2016-01-01 UTC" "2016-06-01 UTC"
哦哦。因此,as.POSIXlt
不能很好地处理 Date
对象,并且总是 returns UTC
而不是本地时区,并且似乎忽略了任何 tz=
参数。由于 UTC
不遵守任何夏令时,您最终总是会返回 FALSE
。
看R源码,好像是这样的。在https://svn.r-project.org/R/trunk/src/main/datetime.c中您可以找到:
# R call:
#> as.POSIXlt.Date
#function (x, ...)
#.Internal(Date2POSIXlt(x))
# source code:
#SEXP attribute_hidden do_D2POSIXlt(SEXP call, SEXP op, SEXP args, SEXP env)
#{
#...
setAttrib(ans, s_tzone, mkString("UTC"));
...作为 hard-coded 字符串。