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

Dav*_*ith 33 r

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

Chr*_*ook 47

更改'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"
Run Code Online (Sandbox Code Playgroud)

请注意,这仍然是POSIXct对象,tzone已更改,并且已应用正确的偏移:

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

$tzone
[1] "America/Los_Angeles"
Run Code Online (Sandbox Code Playgroud)


nnn*_*nnn 36

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


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

force_tz(time, tzone = "America/Los_Angeles")
Run Code Online (Sandbox Code Playgroud)


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

with_tz(time, tzone = "America/Los_Angeles")
Run Code Online (Sandbox Code Playgroud)

  • 比其他方法更清洁. (4认同)

Dav*_*ith 16

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

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

然后用于format在另一个时区打印日期:

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

有一些技巧可以找到合适的时区标识符来使用.这篇文章在Revolutions博客中的更多细节:转换R中的时区:提示,技巧和陷阱

  • Format 会将 posix 对象转换为字符。 (2认同)

Mic*_*ico 7

如果您想在一行中执行此操作,请记住POSIXctR中的任何对象实际上只是一个数字(自纪元开始以来的 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"
Run Code Online (Sandbox Code Playgroud)

as.integer剥离 , 的类和属性x.POSIXct是构造 POSIXct 对象的简写;如果您的对象有毫秒并且您想跟踪它们,您可以使用as.numeric(x).