Подтвердить что ты не робот

Как вы конвертируете даты/время из одного часового пояса в другой в R?

Если у меня есть такая дата в Лондоне: "2009-06-03 19:30", как я могу преобразовать ее в эквивалентное время на Западном побережье США?

4b9b3361

Ответ 1

Сначала преобразуйте лондонское время в объект POSIXct:

pb.txt <- "2009-06-03 19:30"
pb.date <- as.POSIXct(pb.txt, tz="Europe/London")

Затем используйте format для печати даты в другом часовом поясе:

> format(pb.date, tz="America/Los_Angeles",usetz=TRUE)
[1] "2009-06-03 11:30:00 PDT"

Есть несколько трюков для поиска правильного идентификатора часового пояса для использования. Подробнее в этом посте в блоге Revolutions: Преобразование часовых поясов в R: подсказки, трюки и подводные камни

Ответ 2

Измените атрибут tzone объекта POSIXct:

> pb.txt <- "2009-06-03 19:30"  
> pb.date <- as.POSIXct(pb.txt, tz="Europe/London")  
> attributes(pb.date)$tzone <- "America/Los_Angeles"  
> pb.date  
[1] "2009-06-03 11:30:00 PDT"

Обратите внимание, что это все еще объект POSIXct, tzone изменился, и было применено правильное смещение:

> attributes(pb.date)
$class
[1] "POSIXct" "POSIXt" 

$tzone
[1] "America/Los_Angeles"

Ответ 3

Пакет lubridate содержит две функции для преобразования часовых поясов. Согласно страницам справки:


force_tz возвращает дату-время с таким же временем часов, что и x в новом часовом поясе.

force_tz(time, tzone = "America/Los_Angeles")


with_tz изменяет часовой пояс, в котором отображается момент. Время, отображаемое для мгновенных изменений, но момент времени, описанный, остается тем же.

with_tz(time, tzone = "America/Los_Angeles")

Ответ 4

Если вы хотите сделать это в одной строке, вспомните, что любой объект POSIXct в R на самом деле является просто числом (секунды UTC с начала эпохи), и что "часовой пояс" - это просто атрибут, который определяет способ печати этого числа.

Поэтому мы можем использовать вспомогательную функцию .POSIXct следующим образом:

x = as.POSIXct("2009-06-03 19:30", tz = "Europe/London")
.POSIXct(as.integer(x), tz = 'America/Los_Angeles')
# [1] "2009-06-03 11:30:00 PDT"

as.integer удаляет класс и атрибуты x, а .POSIXct - это сокращение для создания объекта POSIXct; если ваш объект имеет миллисекунды и вы хотите отслеживать их, вы можете использовать as.numeric(x).