首页 > 解决方案 > Sys.Date() 忽略系统时区

问题描述

我正在尝试进行一些动态日期/时间计算。我注意到我的日期/时间计算延迟了 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()为 aPOSIXct确认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

有没有人遇到类似的事情?我觉得我在这里错过了一些东西。

标签: r

解决方案


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 对象中恢复时区。


推荐阅读