如果我在伦敦时间有这样的约会时间:“2009-06-03 19:30”,我如何将其转换为美国西海岸的相应时间?
答案 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)
。