4

さらに別の日付/時刻関連の質問 ;-)

狙って撃つ前に

ドイツ + 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ステップ」の解決策ですが、私はそれに満足していません。

  1. さらに別のcontribパッケージ( ISOcodes)に依存しています
  2. インド、ロシア、オーストラリアなどにいる場合、情報が実際にどのように見えるかがわからないため、他のロケールで機能するかどうかをテストすることはできません.

誰かがより良いアイデアを得ましたか?また、ドイツ以外の国の一部の方がこれを実行して、ロケール情報を投稿していただければ幸いです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"
4

2 に答える 2

0

ワークフローの簡素化。

を使用して、ロケールの時間部分だけを取得できます

Sys.getlocale("LC_TIME")

これにより、文字列を分割する必要がなくなります。

lubridate パッケージには Olson スタイルのタイム ゾーン名を取得する関数が含まれているため、読み取りと解析について心配する必要はありませんzone.tab

library(lubridate)
olson_time_zones()
于 2014-01-06T14:45:37.093 に答える