【发布时间】:2010-11-26 13:51:45
【问题描述】:
如果我在伦敦时间有这样的日期:“2009-06-03 19:30”,如何将其转换为美国西海岸的等效时间?
【问题讨论】:
标签: r
如果我在伦敦时间有这样的日期:“2009-06-03 19:30”,如何将其转换为美国西海岸的等效时间?
【问题讨论】:
标签: r
首先,将伦敦时间转换为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"
有一些技巧可以找到要使用的正确时区标识符。更多详情请参阅革命博客上的这篇文章:Converting time zones in R: tips, tricks and pitfalls
【讨论】:
as.POSIXct(format(pb.date, tz="America/Los_Angeles",usetz=TRUE)) 将解决转换为字符。
使用attr()(base R)或lubridate::with_tz()(tidyverse)查看不同时区的同一时刻。
POSIXct 对象的内部值始终为 UTC(自 1970 年初以来的秒数;请参阅?DateTimeClasses,但打印时显示的时间由tzone 属性决定。所以更改tzone属性(通过attr() 或lubridate::with_tz())在不同的时区显示/打印同一时刻。
例如:
pb.txt <- "2009-06-03 19:30"
pb.date <- as.POSIXct(pb.txt, tz="Europe/London")
注意 tzone 属性确定显示/打印时使用的时区:
attributes(pb.date)$tzone
[1] "Europe/London"
pb.date
[1] "2009-06-03 19:30:00 BST"
请注意,无论 tzone 属性如何,内部值都是自 UTC 起源以来的秒数:
as.numeric(pb.date)
[1] 1244053800
在基础 R 中,可以使用 attr() 设置/更改 tzone 属性:
attr(pb.date, "tzone") <- "America/Los_Angeles"
pb.date
[1] "2009-06-03 11:30:00 PDT"
等效地,使用lubridate::with_tz()(也使用attr):
pb.date <- lubridate::with_tz(pb.date, "America/Los_Angeles")
请注意,显示时间现在是 PDT 中的本地时钟时间:
pb.date
[1] "2009-06-03 11:30:00 PDT"
但内部价值没有改变:
as.numeric(pb.date)
[1] 1244053800
所以tzone不影响任何操作,只影响打印时显示的值。
【讨论】:
attr(pb.date, "tzone") <- "America/Los_Angeles"
包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)。
【讨论】: