如何在R中将日期/时间从一个时区转换为另一个时区?
如果我在伦敦时间有这样一个日期:“2009-06-03 19:30”,我如何将其转换为美国西海岸的等效时间?首先,将伦敦时间转换为如何在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
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"