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
и всегда возвращает 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"));
... как жестко запрограммированной строки.
hi pbaylis, можете ли вы рассказать нам, какого результата вы ожидаете? –
'dst (x)' возвращает 'c (FALSE, FALSE)' для меня. В какой часовой зоне вы находитесь? 'dst (x)' вызывает 'as.POSIXlt (x) $ isdst', который использует системный часовой пояс. – thelatemail
Я ожидаю 'c (FALSE, TRUE)' и я в PST (отредактированный вопрос соответственно). – pbaylis