最近更新了 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变得无法使用?
关于使用“国家/地区”(例如
"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"