又一个与日期/时间相关的问题;-)
瞄准和射击之前
德国 + MS Windows + R 组合的情况有点困惑,因为以下会产生无效的时区:
> Sys.timezone()
[1] "MST"
Warning message:
In as.POSIXlt.POSIXct(Sys.time()) : unknown timezone 'MET-1MST'
这绝对不是 R 的错,而是 Windows 的错。因此,首先提出这个问题;-)
问题
是否有一种简单/替代的且独立于操作系统的方式通过区域设置信息查询您当前的国家/地区,然后查找相应的时区(格式 "<country>/<city>"
,例如 德国 "Europe/Berlin"
) ?
我还应该补充一点,我希望该解决方案独立于互联网资源,如本 post/answer 中所述。 .
问题背景
假设您还不知道如何指定您的时区。您可能听说过有关 CET/CEST 等的内容,但据我所知,在使用基本 R 功能时(至少位于德国;-)),这并不能真正帮助您取得任何进展。
您可以获得可用"<country>/<city>"
的列表来自 /share/zoneinfo/zone.tab
的对文件位于您的 RHOME 目录中。然而,为了找到与您当前所在国家/地区相对应的时区,您需要知道 ISO 国家/地区代码。
当然,我们通常为我们的祖国这样做,但我们假设我们不这样做(我想最终采用通用方法)。接下来做什么?
下面是我的“四步”解决方案,但我对此不太满意,因为
- 它依赖于另一个 contrib 包 ( ISOcodes )
- 我无法测试它是否适用于其他区域,因为我不知道如果您位于印度、俄罗斯、澳大利亚等地,这些信息实际上会是什么样子。
有人有更好的主意吗?另外,如果德国以外国家的一些人能够运行此操作并发布他们的区域设置信息 Sys.getlocale()
那就太好了.
第 1 步:获取区域设置信息
loc <- strsplit(unlist(strsplit(Sys.getlocale(), split=";")), split="=")
foo <- function(x) {
out <- list(x[2])
names(out) <- x[1]
out
}
loc <- sapply(loc, foo)
> loc
$LC_COLLATE
[1] "German_Germany.1252"
$LC_CTYPE
[1] "German_Germany.1252"
$LC_MONETARY
[1] "German_Germany.1252"
$LC_NUMERIC
[1] "C"
$LC_TIME
[1] "German_Germany.1252"
第 2 步:从区域设置信息获取国家/地区名称
country.this <- unlist(strsplit(loc$LC_TIME, split="_|\\."))[2]
> country.this
[1] "Germany"
第 3 步:获取 ISO 国家/地区代码
使用country.this
在数据集中查找关联的国家/地区代码 ISO_3166_1
包装数量ISOcodes
require("ISOcodes")
data("ISO_3166_1")
iso <- ISO_3166_1
idx <- which(iso$Name %in% country.this)
code <- iso[idx, "Alpha_2"]
> code
[1] "DE"
第4步:获取时区
使用code
在可从文件 RHOME/share/zoneinfo/zone.tab
派生的数据框中查找时区
path <- file.path(Sys.getenv("R_HOME"), "share/zoneinfo/zone.tab")
tzones <- read.delim(
path,
row.names=NULL,
header=FALSE,
col.names=c("country", "coords", "name", "comments"),
as.is=TRUE,
fill=TRUE,
comment.char = "#"
)
> tzones[which(tzones$country == code), "name"]
[4] "Europe/Berlin"
最佳答案
特别是关于您的问题:
Is there an easy/alternative and OS-independent way to query your current country via locale info and then look up the corresponding time zone?
不 - 没有。这是因为有几个国家/地区有多个时区。仅凭国家/地区无法了解时区。
这就是为什么 TZDB 标识符采用区域/位置
的形式,而不仅仅是国家/地区代码列表。
关于根据区域设置国家信息检索时区(与操作系统无关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11347854/