1

Unixエポック(1970-01-01 00:00:00Z)から整数(秒)として指定されたタイムスタンプがいくつかあるとします。

それらをローカルタイムゾーンの適切な日時に変換するにはどうすればよいですか?私はas.POSIXctヘルプページとSOに関する関連する質問を見てきました。UTCで行うのは簡単ですが、何らかの理由で、ローカルタイムゾーンまたは別のタイムゾーン(BTW、たまたま「America / Los_Angeles」または「PST5PDT」にいる)では簡単に行うことができないようです。指定した時間に日中の節約が有効かどうかに応じて「PST」または「PDT」になります。そのため、私は通常、気難しい「PST」または「PDT」ではなく、ロケーションベースのタイムゾーンを指定します。

例のセットアップ:

z <- c(1360527317,1363019665)

perlでの迅速な検証:

echo -n 1360527317,1363019665 | perl -ne '
use POSIX /strftime/;
$fmt = "%Y-%m-%d %H:%M:%S";
for (split /,/) {
  $loc=strftime("$fmt %Z", localtime($_));
  $gmt=strftime("$fmt GMT", gmtime($_));
  print "$_: $loc $gmt\n";
}'
# gives:
1360527317: 2013-02-10 12:15:17 PST 2013-02-10 20:15:17 GMT
1363019665: 2013-03-11 09:34:25 PDT 2013-03-11 16:34:25 GMT

まず、明らかな(UTCで):

as.POSIXct(z, origin='1970-01-01', tz='GMT')
# --> [1] "2013-02-10 20:15:17 GMT" "2013-03-11 16:34:25 GMT"

これが私が試したことがうまくいかないことです:

as.POSIXct(z, origin='1970-01-01')
# --> (wrong) [1] "2013-02-10 20:15:17 PST" "2013-03-11 17:34:25 PDT"

as.POSIXct(z, origin='1970-01-01 00:00:00 Z')
# --> (wrong) [1] "2013-02-10 20:15:17 PST" "2013-03-11 17:34:25 PDT"

as.POSIXct(z, origin='1970-01-01', tz='America/Los_Angeles')
# --> (wrong) [1] "2013-02-10 20:15:17 PST" "2013-03-11 17:34:25 PDT"

私の知恵の終わりに、ここに私に正しい結果を与える何かがあります:

now=Sys.time(); now+(z-unclass(now))
# --> [1] "2013-02-10 12:15:17 PST" "2013-03-11 09:34:25 PDT"

そして私のシステムのところで:

now=Sys.time()
now
# --> [1] "2013-03-13 18:26:05 PDT"
unclass(now)
# --> [1] 1363224365

したがって、私の設定とローカルタイムゾーンは正しいようです。

上で機能しない行で私が間違っていることについて何か考えはありますか?

それまでの間、私は次のトリックを使用します。他の誰かに役立つことを願っています。

localtime <- function(t) {
  now = Sys.time();
  return(now+(unclass(t)-unclass(now)))
}
# quick test:
localtime(Sys.time())
# --> [1] "2013-03-13 18:33:40 PDT"
localtime(z)
# --> [1] "2013-02-10 12:15:17 PST" "2013-03-11 09:34:25 PDT"
4

2 に答える 2

1

文字列の代わりににDateを渡してみてくださいorigin

as.POSIXct(z, origin=as.Date('1970-01-01'), tz='America/Los_Angeles')
于 2013-03-14T01:38:34.633 に答える
1

UTCとしての解析/保存を区別する必要があります

R> pt <- as.POSIXct(z, origin=as.Date("1970-01-01"))
R> pt
[1] "2013-02-10 14:15:17 CST" "2013-03-11 11:34:25 CDT"

これで、必要なTZを表示できます。

R> format(pt, tz="America/Chicago")
[1] "2013-02-10 14:15:17" "2013-03-11 11:34:25"
R> format(pt, tz="America/Los_Angeles")
[1] "2013-02-10 12:15:17" "2013-03-11 09:34:25"
R> 
于 2013-03-14T01:47:17.127 に答える