我正在尝试进行一些动态的日期/时间计算。我注意到我的日期/时间计算偏离了12个小时。似乎Sys.Date()
忽略了系统时区,尽管系统时区已正确设置,但默认设置为UTC。
Sys.Date()
的帮助说明如下。
详细信息
Sys.time返回一个绝对的日期时间值,该值可以转换为不同的时区,并可能返回不同的日期。
Sys.Date返回当前时区中的当天。
当我检查系统时区时,我可以看到它已正确设置。
> Sys.timezone()
[1] "Pacific/Auckland"
此外,Sys.getlocale()
返回以下内容。似乎这里的一切都很好。
> Sys.getlocale()
[1] "LC_COLLATE=English_New Zealand.1252;LC_CTYPE=English_New Zealand.1252;LC_MONETARY=English_New Zealand.1252;LC_NUMERIC=C;LC_TIME=English_New Zealand.1252"
使用Sys.Date()
获取lubridate::tz()
的时区将返回以下内容。
> lubridate::tz(Sys.Date())
[1] "UTC"
然后,将Sys.Date()
转换为POSIXct
可以确认尽管准确设置了系统时区,但Sys.Date()
的原始时区还是UTC。
> as.POSIXct(Sys.Date())
[1] "2019-07-15 12:00:00 NZST"
最初,我认为Sys.Date()可能已被其他软件包覆盖。重新启动R会话不会更改任何内容。这是我的sessionInfo()
。
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18362)
Matrix products: default
locale:
[1] LC_COLLATE=English_New Zealand.1252 LC_CTYPE=English_New Zealand.1252
[3] LC_MONETARY=English_New Zealand.1252 LC_NUMERIC=C
[5] LC_TIME=English_New Zealand.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] elasticsearchr_0.3.0 viridis_0.5.1 viridisLite_0.3.0 forecast_8.7
[5] extrafont_0.17 forcats_0.4.0 stringr_1.4.0 dplyr_0.8.3
[9] purrr_0.3.2 readr_1.3.1 tidyr_0.8.3 tibble_2.1.3
[13] ggplot2_3.2.0 tidyverse_1.2.1
loaded via a namespace (and not attached):
[1] zoo_1.8-6 tidyselect_0.2.5 urca_1.3-0 haven_2.1.1 lattice_0.20-38
[6] colorspace_1.4-1 generics_0.0.2 rlang_0.4.0 pillar_1.4.2 glue_1.3.1
[11] withr_2.1.2 modelr_0.1.4 TTR_0.23-4 readxl_1.3.1 quantmod_0.4-15
[16] timeDate_3043.102 munsell_0.5.0 gtable_0.3.0 cellranger_1.1.0 rvest_0.3.4
[21] tseries_0.10-47 lmtest_0.9-37 curl_3.3 parallel_3.6.1 Rttf2pt1_1.3.7
[26] broom_0.5.2 xts_0.11-2 Rcpp_1.0.1 scales_1.0.0 backports_1.1.4
[31] jsonlite_1.6 gridExtra_2.3 fracdiff_1.4-2 hms_0.4.2 stringi_1.4.3
[36] grid_3.6.1 quadprog_1.5-7 cli_1.1.0 tools_3.6.1 magrittr_1.5
[41] lazyeval_0.2.2 crayon_1.3.4 extrafontdb_1.0 pkgconfig_2.0.2 xml2_1.2.0
[46] lubridate_1.7.4 assertthat_0.2.1 httr_1.4.0 rstudioapi_0.10 R6_2.4.0
[51] nnet_7.3-12 nlme_3.1-140 compiler_3.6.1
有人遇到类似的事情吗?我觉得我在这里缺少什么。
答案 0 :(得分:2)
Sys.Date
返回一个Date对象,该对象不包含时区属性:
> str(Sys.Date())
Date[1:1], format: "2019-07-14"
lubridate::tz
如果不存在时区属性,则返回“ UTC”:
function (x)
{
tzone <- attr(x, "tzone")[[1]]
if (is.null(tzone) && !is.POSIXt(x))
return("UTC")
if (is.character(tzone) && nzchar(tzone))
return(tzone)
tzone <- attr(as.POSIXlt(x[1]), "tzone")[[1]]
if (is.null(tzone))
return("UTC")
tzone
}
所以不是Sys.Date
忽略了系统时区;因为Date对象不包含任何时区信息,所以您无法从Date对象中恢复时区。