Смещение временных интервалов немного сложно. Вам нужно сначала отступить и понять, что фактическое сохраненное время - это число (секунд с момента 1 января 1970 года), представляющее абсолютное время. Т.е. посмотреть, как я представляю тот же момент времени («эпоха») в качестве местного времени в Нью-Йорке и Москве:
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>
Теперь время, которое вы сохранили, вероятно, были разобраны, как МестноеВремя. То есть они содержат хранилище смещения в качестве часового пояса. Изменяя, что вы просто двигаться по отношению к предыдущему времени:
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>
Так я правильно понимаю ваш вопрос, вам нужно сделать две вещи: «отменить» местное время вы имеете, а затем перейти к нужному часовому поясу.
Я написал для этого помощника - в пакете RcppCCTZ. Вот один пример для функции toTz()
:
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"
Это также показывает дополнительные трудности обеспечения того, чтобы при печати на нужных временные зоны - только второй пример показывает правильное время Сиднея, как мы явно сказали format()
использовать его ,
Так, чтобы вернуться к вашему примеру:
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>
Так я явно изменил числовое значения на 60 минут, чтобы объяснить тот факт, что я сдвинут время на час (из Чикаго, мое местное время , в Нью Йорк).