如何在R中将日期/时间从一个时区转换为另一个时区?

时间:2009-09-08 17:07:07

标签: r

如果我在伦敦时间有这样的约会时间:“2009-06-03 19:30”,我如何将其转换为美国西海岸的相应时间?

4 个答案:

答案 0 :(得分:43)

更改'POSIXct'对象的tzone属性:

> 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"

答案 1 :(得分:29)

lubridate包含两个转换时区的函数。根据帮助页面:


force_tz返回与新时区中x具有相同时钟时间的日期时间。

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


with_tz更改即时显示的时区。为即时更改显示的时钟时间,但描述的时刻保持不变。

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

答案 2 :(得分:15)

首先,将伦敦时间转换为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博客中这篇文章的更多细节:Converting time zones in R: tips, tricks and pitfalls

答案 3 :(得分:2)

如果您想在一行中执行此操作,请回想一下R中的任何POSIXct对象实际上只是一个数字(自纪元开始以来的UTC时间),以及&#34;时区&# 34;只是一个属性,用于确定该数字打印的方式

因此,我们可以使用.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)