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

如何在R中将日期/时间从一个时区转换为另一个时区?,r,R,如果我在伦敦时间有这样一个日期:“2009-06-03 19:30”,我如何将其转换为美国西海岸的等效时间?首先,将伦敦时间转换为POSIXct对象: pb.txt <- "2009-06-03 19:30" pb.date <- as.POSIXct(pb.txt, tz="Europe/London") 找到要使用的正确时区标识符有一些技巧。这篇文章的更多详细信息请访问Revolutions博客:使用attr()(base R)或lubridate::with_tz()(tid

如果我在伦敦时间有这样一个日期:“2009-06-03 19:30”,我如何将其转换为美国西海岸的等效时间?

首先,将伦敦时间转换为
POSIXct
对象:

pb.txt <- "2009-06-03 19:30"
pb.date <- as.POSIXct(pb.txt, tz="Europe/London")
找到要使用的正确时区标识符有一些技巧。这篇文章的更多详细信息请访问Revolutions博客:

使用
attr()
(base R)或
lubridate::with_tz()
(tidyverse)查看不同时区中的同一时刻

force_tz(time, tzone = "America/Los_Angeles")
POSIXct对象的内部值始终以UTC为单位(自1970年初以来的秒数;请参见
?DateTimeClasses
,但打印时显示的时间由
tzone
属性确定。因此更改
tzone
属性(通过
attr()
lubridate::with_tz()
)显示/打印不同时区中的同一时刻

force_tz(time, tzone = "America/Los_Angeles")
例如:

pb.txt <- "2009-06-03 19:30"  
pb.date <- as.POSIXct(pb.txt, tz="Europe/London") 
请注意,无论tzone属性如何,内部值均为UTC中自原点起的秒数:

as.numeric(pb.date)
[1] 1244053800
在base R中,可以使用
attr()
设置/更改tzone属性:

请注意,显示时间现在是PDT中的本地时钟时间:

pb.date  
[1] "2009-06-03 11:30:00 PDT"
但内部价值没有改变:

as.numeric(pb.date)
[1] 1244053800

因此tzone不会影响任何操作,只会在打印时显示值。

Package
lubridate
包含两个转换时区的功能。根据帮助页面:


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

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

with_tz
更改显示某个瞬间的时区。显示该瞬间的时钟时间会更改,但所描述的时刻保持不变

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

如果您想在一行中执行此操作,请记住,R中的任何
POSIXct
对象实际上只是一个数字(从纪元开始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)

格式将posix对象转换为字符。此转换是否考虑日光节约调整?是的,如果位置在时区数据库中,它会进行适当的递增/递减。我们在哪里找到“tz”s的数据库?
as.POSIXct(格式(pb.date,tz=“America/Los_Angeles”,usetz=TRUE))
将解决字符转换问题。别忘了检查已接受答案评论()中的链接。我使用了EST,认为这个答案不起作用!或者,
attr(pb.date,“tzone”)相关:。比其他方法更简洁。只需修复一个拼写错误,并添加源代码以防止错误x=as.POSIXct(“2009-06-03 19:30”,tz=“欧洲/伦敦”)x=as.POSIXct(as.integer(x),tz='America/Los_Angeles',origin='1970-01-01')x
with_tz(time, tzone = "America/Los_Angeles")
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"