3

POSIX 日付から 1 日を差し引いて、DST の前後で同時に終了したいと考えています。

たとえば、1 日を追加すると、次のようになります。

> as.POSIXct('2009-03-08 23:00:00.000') + 86400
[1] "2009-03-09 23:00:00 EDT"

しかし、私が過去に行くと、それは相殺されます:

> as.POSIXct('2009-03-08 23:00:00.000') - 86400
[1] "2009-03-07 22:00:00 EST"

DST 前後の絶対時差に対処する最善の方法は何ですか? 通常、私は時間を文字列に変換し、DST が適用されないように別々に処理することでこれに対処します。

4

5 に答える 5

2

あなたのコードは、1 日を加算または減算するように要求したのではなく、 24 時間を加算または減算するように要求したため、要求したことを正確に実行しています。24時間(86400秒)前2009-03-08 23:00:00 EDT 2009-03-07 22:00:00 EST目安です。私は R ライブラリには詳しくありませんが、それらがラップする POSIX 関数には精通しています。POSIXct を取得し、そのプロパティを 1 減らしてからviadayに「再キャスト」すると(たとえば、2 月 -1 日が 1 月 31 日になるようにするため)、確実に 1 日を減算できるはずです。POSIXctPOSIXlt

于 2009-09-13T01:57:31.150 に答える
1

ありがとうホッブズ!もう少し作業を行う必要がありますが、POSIXlt では日枠からの減算が機能します。

> a <- as.POSIXct('2009-03-08 23:00:00.000')
> as.POSIXlt(a)
[1] "2009-03-08 23:00:00 EDT"
> a <- as.POSIXlt(a)
> a$mday <- a$mday -1
> a
[1] "2009-03-07 23:00:00 EDT"
于 2009-09-16T02:14:05.743 に答える
1

日時を UTC として保存します。この場合、UTC に変換して 1 日を減算し、現地時間に戻します。(これはうるう秒を無視します)

于 2009-09-08T19:49:24.427 に答える
0

単に日数を数えたい場合は、日をtrunc移動するために使用できます。

> trunc(Sys.time(), "day") + 86400
[1] "2009-09-13 PDT"
> trunc(Sys.time(), "day") - 86400
[1] "2009-09-11 PDT"
于 2009-09-13T01:44:56.043 に答える
0

このパッケージlubridateは、基本パッケージでは不明な点を指定する 2 つの追加の timespan クラスを提供します。そのマニュアルから:

期間

期間は、2 つの瞬間の間に発生する正確な時間を測定します。これにより、間隔内でうるう秒、うるう年、または夏時間 (DST) の変更が発生した場合、クロック時間に関して予期しない結果が生じる可能性があります。

ピリオド

期間は、2 つの瞬間の間に発生するクロック時間の変化を測定します。期間は、うるう秒、うるう年、および DST の変更が存在する場合に、クロック時刻の堅牢な予測を提供します。

于 2014-02-13T12:50:46.293 に答える