Das Verschieben von Zeitzonen ist ein wenig schwierig. Sie müssen zuerst zurücktreten und erkennen, dass die tatsächlich gespeicherte Zeit eine Anzahl (seit der Epoche 1. Januar 1970 Sekunden) repräsentativer absoluter Zeit ist. Dh, wie ich denselben Zeitpunkt („Epoche“) als Ortszeit in New York und Moskau vertreten:
R> format(as.POSIXct(0,origin="1970-01-01"), tz="UTC")
[1] "1970-01-01"
R> format(as.POSIXct(0,origin="1970-01-01"), tz="America/New_York")
[1] "1969-12-31 19:00:00"
R> format(as.POSIXct(0,origin="1970-01-01"), tz="Europe/Moscow")
[1] "1970-01-01 03:00:00"
R>
Nun haben die Zeit, die Sie wahrscheinlich als Lokalzeit analysiert gespeichert wurde. Das heißt, sie enthalten einen Offset-Speicher als Zeitzone. Durch die Änderung, die Sie gerade zu der vorherigen Zeit relativ bewegen:
R> as.POSIXct("2016-09-10 16:38:00") # CDT as I am in Chicago
[1] "2016-09-10 16:38:00 CDT"
R> format(as.POSIXct("2016-09-10 16:38:00"), tz="America/New_York")
[1] "2016-09-10 17:38:00"
R> format(as.POSIXct("2016-09-10 16:38:00"), tz="America/Los_Angeles")
[1] "2016-09-10 14:38:00"
R>
So verstehe ich Ihre Frage richtig, müssen Sie zwei Dinge tun: ‚rückgängig machen‘ die lokale Zeit, die Sie haben und dann auf die gewünschte Zeitzone bewegen.
Ich schrieb auch einen Helfer - im RcppCCTZ-Paket. Hier ist ein Beispiel für die toTz()
Funktion:
R> example(toTz)
toTzR> toTz(Sys.time(), "America/New_York", "Europe/London")
[1] "2016-12-17 01:04:14.184086 CST"
toTzR> # this redoes the 'Armstrong on the moon in NYC and Sydney' example
toTzR> # note that the default print method will print the return object in _your local time_
toTzR> toTz(ISOdatetime(1969,7,20,22,56,0,tz="UTC"), "America/New_York", "Australia/Sydney", verbose=TRUE)
1969-07-20 22:56:00 -0400
1969-07-21 12:56:00 +1000
[1] "1969-07-20 21:56:00 CDT"
toTzR> # whereas explicitly formating for Sydney time does the right thing
toTzR> format(toTz(ISOdatetime(1969,7,20,22,56,0,tz="UTC"),
toTz+ "America/New_York", "Australia/Sydney", verbose=TRUE),
toTz+ tz="Australia/Sydney")
1969-07-20 22:56:00 -0400
1969-07-21 12:56:00 +1000
[1] "1969-07-21 12:56:00"
Dies zeigt auch die zusätzliche Schwierigkeit, sicherzustellen, dass Sie auf die gewünschte Zeitzone drucken - nur das zweite Beispiel zeigt die richtige Sydney Zeit, wie wir ausdrücklich format()
gesagt, es zu benutzen .
So zu Ihrem Beispiel zu kommen:
R> x <- xts(1:2, Sys.time() + 0:1)
R> x
[,1]
2016-12-16 20:13:43.29767 1
2016-12-16 20:13:44.29767 2
R> tzone(x) <- "America/New_York"
R> x
[,1]
2016-12-16 21:13:43.29767 1
2016-12-16 21:13:44.29767 2
Warning message:
timezone of object (America/New_York) is different than current timezone().
R> index(x) <- index(x) - 60*60 # dirty method, last resort
R> x
[,1]
2016-12-16 20:13:43.29767 1
2016-12-16 20:13:44.29767 2
Warning message:
timezone of object (America/New_York) is different than current timezone().
R> tzone(x)
TZ
"America/New_York"
R>
So explizit Ich hat den numerischen Wert von 60 Minuten für die Tatsache zu berücksichtigen, dass ich die Zeit um eine Stunde verschoben (aus Chicago, meiner Ortszeit , nach New York).