无法识别的时区

问题描述 投票:0回答:1

最近更新了 Ubuntu (23.10 mantic),我的 R 不再识别

"US/Eastern"

sessionInfo()
# R version 4.3.2 (2023-10-31)
# Platform: x86_64-pc-linux-gnu (64-bit)
# Running under: Ubuntu 23.10
# Matrix products: default
# BLAS:   /opt/R/4.3.2/lib/R/lib/libRblas.so 
# LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/liblapack.so.3;  LAPACK version 3.11.0
# locale:
#  [1] LC_CTYPE=C.UTF-8       LC_NUMERIC=C           LC_TIME=C.UTF-8        LC_COLLATE=C.UTF-8     LC_MONETARY=C.UTF-8    LC_MESSAGES=C.UTF-8   
#  [7] LC_PAPER=C.UTF-8       LC_NAME=C              LC_ADDRESS=C           LC_TELEPHONE=C         LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C   
# time zone: America/New_York
# tzcode source: system (glibc)
# attached base packages:
# [1] stats     graphics  grDevices utils     datasets  methods   base     
# other attached packages:
# [1] r2_0.10.0
# loaded via a namespace (and not attached):
#  [1] compiler_4.3.2  clipr_0.8.0     fastmap_1.1.1   cli_3.6.2       tools_4.3.2     htmltools_0.5.7 rmarkdown_2.25  knitr_1.45      xfun_0.41      
# [10] digest_0.6.34   rlang_1.1.3     evaluate_0.23  

lubridate::with_tz(Sys.time(), tzone = "US/Eastern")
# Warning in with_tz.default(Sys.time(), tzone = "US/Eastern") :
#   Unrecognized time zone 'US/Eastern'
# [1] "2024-03-18 13:49:56"

然而,在类似配置(R-wise)22.04 jammy 系统上,它工作得很好。

sessionInfo()
# R version 4.3.2 (2023-10-31)
# Platform: x86_64-pc-linux-gnu (64-bit)
# Running under: Ubuntu 22.04.4 LTS
# Matrix products: default
# BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
# LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so;  LAPACK version 3.10.0
# locale:
#  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
# time zone: Etc/UTC
# tzcode source: system (glibc)
# attached base packages:
# [1] stats     graphics  grDevices utils     datasets  methods   base
# loaded via a namespace (and not attached):
# [1] compiler_4.3.2

lubridate::with_tz(Sys.time(), tzone = "US/Eastern")
# [1] "2024-03-18 09:49:19 EDT"

为什么正常认可的TZ变得无法使用?

r linux timezone lubridate tzdata
1个回答
0
投票

关于使用“国家/地区”(例如

"US/Eastern"
)而不是“大陆/城市”(
"America/New_York"
)的争论并不新鲜。后者的含糊性较少,地缘政治力量可以改变前者的含义。到目前为止(而且仍然如此),立场一直是保持向后兼容性。

但是,当

tzdata
2024 发布时,在 Ubuntu 23.10 上,该软件包不包含
US/
符号链接; Ubuntu 22.04 上的相同软件包确实包含链接。

该修复是操作系统级别的修复,假设您拥有底层文件系统的 root 访问权限,那么修复就很简单。

mkdir /usr/share/zoneinfo/US
cd /usr/share/zoneinfo/US
ln -s ../America/Anchorage Alaska
ln -s ../America/Adak Aleutian
ln -s ../America/Phoenix Arizona
ln -s ../America/Chicago Central
ln -s ../America/New_York Eastern
ln -s ../America/Indiana/Indianapolis East-Indiana
ln -s ../Pacific/Honolulu Hawaii
ln -s ../America/Indiana/Knox Indiana-Starke
ln -s ../America/Detroit Michigan
ln -s ../America/Denver Mountain
ln -s ../America/Los_Angeles Pacific
ln -s ../Pacific/Pago_Pago Samoa

之后,重新启动 R(“不应该”需要重新安装

lubridate
timechange
R 软件包),然后它就应该可以工作了。

lubridate::with_tz(Sys.time(), tzone = "US/Eastern")
# [1] "2024-03-18 09:55:08 EDT"
© www.soinside.com 2019 - 2024. All rights reserved.