2017-02-03 6 views
2

У меня есть переменная POSIXct, которая читает 2016-12-15 20:11:29 PST, но PST неверен. Он должен на самом деле читать 2016-12-15 20:11:29 GMTПреобразование неправильного часового пояса

мне нужно сделать часовой пояс правильно, GMT, то мне нужно, чтобы преобразовать его в Нью-Йорк времени

Так что я дал 2016- 12-15 20:11:29 PST. Это действительно должно быть 2016-12-15 20:11:29 GMT, тогда мне нужно конвертировать 2016-12-15 20:11:29 GMT в «America/New_York», поэтому окончательный результат будет 16:11:29 Америка/New_York, потому что время в Нью-Йорке длится по часовой стрелке.

Я пробовал это много способов, но не могу заставить его работать. Есть идеи?

p = as.POSIXct("2016-12-15 20:11:29 PST") 
p 

********** UPDATE ********* мой реальный код использует переменную и предлагаемые решения не работают. смотри ниже

 p = as.POSIXct("2016-12-15 20:11:29 PST") 
      out = as.POSIXct(p, tz="GMT") 
      out 
      attr(out,"tzone") <- "America/New_York" 
      out 

>   out 
[1] "2016-12-15 20:11:29 PST" 
>   attr(out,"tzone") <- "America/New_York" 
>   out 
[1] "2016-12-15 23:11:29 EST" ### this is incorrect 

*** Это также лань сопли работы

p = as.POSIXct(p, usetz=TRUE, tz="GMT") 
     (format(p, tz="America/New_York")) 

[1] "2016-12-15 23:11:29 EST" 
> p = as.POSIXct(p, usetz=TRUE, tz="GMT") 
>   (format(p, tz="America/New_York")) 
[1] "2016-12-15 23:11:29" 

ответ

1

Ваш вопрос в том, что ваш p в вашей системе временной зоны по умолчанию:

p = as.POSIXct("2016-12-15 20:11:29 PST") 
p 
# I'm in Australian Eastern Standard Time, AEST 
#[1] "2016-12-15 20:11:29 AEST" 
as.numeric(p) 
#[1] 1481796689 

Преобразовать эти локальные даты и время в UTC, которая изменяет основные данные, , при форматировании и сброса часового пояса по Гринвичу (если вы уже по Гринвичу, то он не будет делать ничего, конечно):

p2 <- as.POSIXct(format(p),tz="UTC") 
p2 
#[1] "2016-12-15 20:11:29 UTC" 
as.numeric(p2) 
#[1] 1481832689 
p2 - p 
#Time difference of 10 hours 
# ...which is the difference between AEST and GMT 

Тогда вы с отрегулируйте атрибут часовой пояс, который просто изменит отображение объекта даты/времени. Он не влияет на базовые числовые данные:

attr(p2,"tzone") <- "America/New_York" 
p2 
#[1] "2016-12-15 15:11:29 EST" 

as.numeric(p2) 
#[1] 1481832689 
1

Я могу вам большую часть пути там, но R думает ваш неправы о времени дифференциала:

> p = as.POSIXct("2016-12-15 20:11:29 PST", usetz=TRUE, tz="GMT") 
> p 
[1] "2016-12-15 20:11:29 GMT" 
> (format(p, tz="America/New_York")) 
[1] "2016-12-15 15:11:29" 

Ответ на редактирование. Я не вижу проблемы. Числовое представление времени в R всегда является GMT. Вы можете делать что-то на входе с параметром, чтобы заглушить неправильный tz, но тогда ваш вывод с format или strftime просто должен указать параметр для другого часового пояса. (С использованием переменного не должен иметь никакого эффекта.)

p = "2016-12-15 20:11:29 PST" 
pp = as.POSIXct(p, usetz=TRUE, tz="GMT") 
pp 
[1] "2016-12-15 20:11:29 GMT" 
+0

'out <- as.POSIXct (« 2016-12-15 20:11:29 PST », tz =« GMT »); attr (out, "tzone") <- "America/New_York" ', если вы хотите сохранить структуру POSIXct, но изменить часовой пояс. Но я согласен с тем, что результат 15:11:29 – thelatemail

+0

Я вижу, что это работает в вашем коде, но в моем реальном коде у меня есть varaible, var, а не строка. поэтому он выглядит примерно как .POSIXct (var, usetz = TRUE, tz = "GMT"), и он не работает. Я попытаюсь воспроизвести и обновить вопрос – user3022875

+0

, пожалуйста, см. Edit – user3022875

Смежные вопросы