当前位置 : 主页 > 网络推广 > seo >

根据区域设置国家/地区信息检索时区(与操作系统无关)

来源:互联网 收集:自由互联 发布时间:2021-06-16
还有另一个日期/时间相关的问题;-) 在你瞄准和射击之前 事情有点混乱德国​​MS Windows R组合,因为以下产生无效时区: Sys.timezone()[1] "MST"Warning message:In as.POSIXlt.POSIXct(Sys.time()) : unknown
还有另一个日期/时间相关的问题;-)

在你瞄准和射击之前

事情有点混乱德国​​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标识符采用区域/位置的形式,而不仅仅是国家代码列表.

网友评论