さらに別の日付/時刻関連の質問 ;-)
狙って撃つ前に
ドイツ + MS Windows + Rの組み合わせでは、次のように無効なタイム ゾーンが生成されるため、ちょっとした混乱が生じます。
> Sys.timezone()
[1] "MST"
Warning message:
In as.POSIXlt.POSIXct(Sys.time()) : unknown timezone 'MET-1MST'
それは間違いなく R のせいではなく、Windows のせいです。したがって、そもそも質問です;-)
質問
ロケール情報を介して現在の国を照会し、対応するタイムゾーン (フォーマット、ドイツなど)を検索する、簡単/代替で OS に依存しない方法はありますか?"<country>/<city>"
"Europe/Berlin"
また、この投稿/回答に記載されているように、ソリューションをインターネット リソースから独立させたいことも付け加えておきます。
問題の文脈
タイムゾーンを指定する方法がまだわからないとします。CET/CESTなどについて何か聞いたことがあるかもしれませんが、ベース R 機能を使用している場合 (少なくともドイツにある場合は ;-))、実際にはどこにも行きません。
RHOME ディレクトリ内のファイルから、使用可能な "<country>/<city>"
ペアのリストを取得できます。/share/zoneinfo/zone.tab
ただし、現在いる国に対応するタイム ゾーンを見つけるには、ISO 国コードを知る必要があります。
もちろん、私たちは通常、母国のためにそうしますが、そうしないとしましょう (私は一般的なアプローチで終わりたいと思います)。次に何をしますか?
以下は私の「4ステップ」の解決策ですが、私はそれに満足していません。
- さらに別の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 国コードを取得する
パッケージISOcodecountry.this
のデータセットで関連する国コードを検索するために使用します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: タイムゾーンを取得する
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"