在你瞄准和射击之前
事情有点混乱德国MS Windows R组合,因为以下产生无效时区:
> Sys.timezone() [1] "MST" Warning message: In as.POSIXlt.POSIXct(Sys.time()) : unknown timezone 'MET-1MST'
这绝对不是R的错,它是Windows.因此,首先是问题;-)
题
是否有简单/替代和独立于操作系统的方式通过区域设置信息查询您当前的国家/地区,然后查找相应的时区(格式为“< country> /< city>”,例如德国的“欧洲/柏林”) ?
我还要补充一点,我希望解决方案独立于互联网资源,如post/answer所述.
问题背景
假设您还不知道如何指定时区.你可能听说过有关CET / CEST等的东西,但AFAIK在使用基本R功能时并没有真正让你到处(至少位于德国;-)).
您可以获取可用的“< country> /< city>”列表来自RHOME目录中的/share/zoneinfo/zone.tab文件的对.但是,为了找到与您当前所在国家/地区相对应的时区,您需要知道ISO国家/地区代码.
当然,我们通常会为我们的祖国做,但我们假设我们不这样做(我想最终采用通用方法).下一步你要怎么做?
以下是我的“四步”解决方案,但我对此并不满意,因为
>它依赖于另一个贡献包(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在软件包ISOcodes的数据集ISO_3166_1中查找关联的国家/地区代码
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步:获取时区
使用代码在数据框中查找可从文件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标识符采用区域/位置的形式,而不仅仅是国家代码列表.