1

解決できない理由により、奇妙なタイムゾーンの R データが配信されます。

データセットの最新の日付が特定の日付 (現在の日付など) と等しいかどうかをテストしたいのですが、(望ましくない) タイムゾーン変換に問題があります。タイムゾーンが異なっていても、2 つの日付文字列が同じかどうかをテストする自然な方法はありますか? データのタイムゾーンは必ずしもわかりません。

私は2つの「解決策」を見つけましたが、どちらも非効率的な(そして制限のある)ハックのようです:

substr(as.character(last(odd_data$date)), 1, 10) == substr(as.character(Sys.Date()), 1, 10)

lastDate <- as.POSIXlt(last(odd_data$date))
as.Date(paste0(lastDate$year + 1900, "-", lastDate$mon + 1, "-", lastDate$mday)) == Sys.Date()

どちらも私が必要とする答えを得ることができますが、私は言語に反対していると感じています.

私が答えたい質問は次のとおりです:異なるタイムゾーンの人々が実験が行われた日付を書き留めた場合、それは私が提供した日付と同じでしたSys.Date()か?

--

曖昧さ回避 -- 次の 2 つの日付があるとします。

> date.Syd <- as.POSIXct("2012-12-11 08:30:01", tz = 'Australia/Sydney')
> date.Syd
[1] "2012-12-11 08:30:01 EST"

> date.Ldn <- as.POSIXct("2012-12-11 23:00:11", tz = 'GMT')
> date.Ldn
[1] "2012-12-11 23:00:11 GMT"

どこ:

> as.Date(date.Syd)
[1] "2012-12-10"
> unclass(date.Syd)
[1] 1355175001
attr(,"tzone")
[1] "Australia/Sydney"

> as.Date(date.Ldn)
[1] "2012-12-11"
> unclass(date.Ldn)
[1] 1355266811
attr(,"tzone")
[1] "GMT"

この場合、タイム ゾーンの変換が原因で、日付が等しいかどうかのテストが (望ましくなく) 失敗します。

> as.Date(date.Syd) == as.Date(date.Ldn)
[1] FALSE

これが、醜いキャラクター/POSIXlt ハックを使用した理由です。

> substr(as.character(date.Syd), 1,10) == substr(as.character(date.Ldn), 1,10)
[1] TRUE

> date.Syd_lt <- as.POSIXlt(date.Syd)
> date.Ldn_lt <- as.POSIXlt(date.Ldn)

> paste0(date.Syd_lt$year + 1900, "-", date.Syd_lt$mon + 1, "-", date.Syd_lt$mday) == 
+ paste0(date.Ldn_lt$year + 1900, "-", date.Ldn_lt$mon + 1, "-", date.Ldn_lt$mday)
[1] TRUE
4

2 に答える 2

1

に変換するとDate、タイムゾーン情報が失われます。

?Sys.Date言うように

「Sys.Date」は、現在のタイムゾーンで現在の日付を返します。

したがって、特定の時点で、現在のタイムゾーンに応じて異なる値が返される場合があります。

> Sys.setenv(TZ="Australia/Sydney")
> d <- Sys.Date()
> d
[1] "2012-12-11"

> Sys.setenv(TZ="America/Los_Angeles")
> Sys.Date()
[1] "2012-12-10"
> d
[1] "2012-12-11"

Sys.time()代わりに、タイムゾーン情報を含む whichを使用できます。POSIXct

> Sys.setenv(TZ="America/Los_Angeles")
> .POSIXct(Sys.time(), tz='America/Los_Angeles')
[1] "2012-12-10 18:01:26.667964 PST"
> .POSIXct(Sys.time(), tz='Australia/Sydney')
[1] "2012-12-11 13:01:26.668636 EST"

> Sys.setenv(TZ="Australia/Sydney")
> .POSIXct(Sys.time(), tz='America/Los_Angeles')
[1] "2012-12-10 18:01:26.669352 PST"
> .POSIXct(Sys.time(), tz='Australia/Sydney')
[1] "2012-12-11 13:01:26.669907 EST"

IMO、POSIXlt一般的には避けるべきですが、本当にしたい場合は、に変換できますPOSIXlt

> Sys.setenv(TZ="America/Los_Angeles")
> as.POSIXlt(Sys.time(), tz='America/Los_Angeles')
[1] "2012-12-10 18:09:27.135976 PST"
> as.POSIXlt(Sys.time(), tz='Australia/Sydney')
[1] "2012-12-11 13:09:27.137197 EST"

> Sys.setenv(TZ="Australia/Sydney")
> as.POSIXlt(Sys.time(), tz='America/Los_Angeles')
[1] "2012-12-10 18:09:27.138371 PST"
> as.POSIXlt(Sys.time(), tz='Australia/Sydney')
[1] "2012-12-11 13:09:27.13928 EST"
于 2012-12-11T02:04:49.197 に答える
1

入力時に日時関数に「tz」引数を認識させる唯一の方法は、as.POSIXct を使用する前に as.POSIXlt を使用することです。

> date.p5 <- as.POSIXct( as.POSIXlt(Sys.time(), tz = 'GMT+5'))
> date.m5 <- as.POSIXct( as.POSIXlt(Sys.time(), tz = 'GMT-5'))
> date.p5
[1] "2012-12-11 01:02:51 GMT"
> date.m5
[1] "2012-12-11 11:03:05 GMT"

> date.m5C <-  as.POSIXct(Sys.time(), tz = 'GMT-5')
> date.m5C
[1] "2012-12-10 22:08:19 PST"
> date.p5C <-  as.POSIXct(Sys.time(), tz = 'GMT+5')
> date.p5C
[1] "2012-12-10 22:08:44 PST"

> date.l0PST <-  as.POSIXlt(Sys.time(), tz = 'PST')
> date.l0PST
[1] "2012-12-11 06:15:31 UTC"  # My clock reads 22:15:31 Pacific (US) Standard Time
> date.c0PST <-  as.POSIXct(Sys.time(), tz = 'PST')
> date.c0PST
[1] "2012-12-10 22:15:42 PST"
于 2012-12-11T06:28:00.433 に答える