Windows10同配置R/lubridate两台机器出现tz/CCTZ错误差异
同一R与lubridate配置下Windows笔记本报错、台式机正常的原因分析
以下代码在Windows10笔记本上出现错误,但在配置完全相同(R版本4.2.1、lubridate版本1.8.0)的Windows10台式机上可正常运行,请问可能的原因是什么?
> library(lubridate) Attaching package: ‘lubridate’ The following objects are masked from ‘package:base’: date, intersect, setdiff, union > Sys.getenv("TZDIR") [1] "C:/PROGRA~1/R/R-42~1.1/share/zoneinfo" > lubridate::force_tz(ymd_hm("2021-03-01 10:40"), tz="UTC") [1] "2021-03-01 10:40:00 UTC" > lubridate::force_tz(as.POSIXct("2021-03-01 10:40"), tz="UTC") Error: CCTZ: Unrecognized timezone of the input vector: "" > > lubridate::force_tz(ymd_hm("2021-03-01 10:40"), tz=Sys.timezone()) Error: CCTZ: Unrecognized output timezone: "Australia/Sydney" > > R.version _ platform x86_64-w64-mingw32 arch x86_64 os mingw32 crt ucrt system x86_64, mingw32 status major 4 minor 2.1 year 2022 month 06 day 23 svn rev 82513 language R version.string R version 4.2.1 (2022-06-23 ucrt) nickname Funny-Looking Kid > packageVersion("lubridate") [1] ‘1.8.0’
可能的原因
- 时区数据库文件异常:笔记本上R的时区数据库目录(
C:/PROGRA~1/R/R-42~1.1/share/zoneinfo)可能存在文件损坏、缺失,或者权限限制导致lubridate无法读取,而台式机的该目录文件完整可访问。 - 系统时区配置差异:两台电脑的Windows系统时区设置存在隐性差异,比如笔记本的时区注册表项损坏,导致
Sys.timezone()返回的Australia/Sydney无法被lubridate依赖的CCTZ时区库正确解析。 - 用户权限问题:笔记本可能以普通用户权限运行R,无法读取时区数据库目录的文件;台式机则可能使用管理员权限,或该目录的文件权限设置更宽松。
- POSIXct对象时区缺失:笔记本上
as.POSIXct("2021-03-01 10:40")生成的对象未附带时区信息(报错显示输入时区为空),这是因为系统默认时区配置异常,导致base R无法自动为POSIXct对象赋予时区,而台式机的默认时区配置正常。 - CCTZ库缓存异常:lubridate依赖的CCTZ库在笔记本上存在异常本地缓存,导致时区识别失败,台式机的缓存状态则正常。
内容的提问来源于stack exchange,提问作者Glenn Stone
相关产品推荐
相关产品推荐

