我有一个POSIXct
对象,并且想更改它的tz
属性而不用 R 来解释它(解释它意味着更改日期时间在屏幕上的显示方式)。
一些背景:我正在使用fasttime
来自 S.Urbanek 的包,它接受字符串并POSIXct
非常快速地将其转换为。问题是字符串应该代表“GMT”中的日期时间,而我的数据不是这样。
我最终得到一个POSIXct
对象tz=GMT
,实际上它是tz=GMT+1
,如果我改变时区
attr(datetime, "tzone") <- "Europe/Paris";
datetime <- .POSIXct(datetime,tz="Europe/Paris");
那么它将被“显示”为GMT+2
(基础价值永远不会改变)。
编辑:这是一个例子
datetime=as.POSIXct("2011-01-01 12:32:23.234",tz="GMT")
attributes(datetime)
#$tzone
#[1] "GMT"
datetime
#[1] "2011-01-01 12:32:23.233 GMT"
如何在没有 R 的情况下更改此属性来解释它,也就是如何更改 tzone 并仍然将日期时间显示为"2011-01-01 12:32:23.233"
?
编辑/解决方案,@GSee 的解决方案相当快,lubridate::force_tz 非常慢
datetime=rep(as.POSIXct("2011-01-01 12:32:23.234",tz="GMT"),1e5)
f <- function(x,tz) return(as.POSIXct(as.numeric(x), origin="1970-01-01", tz=tz))
> system.time(datetime2 <- f(datetime,"Europe/Paris"))
user system elapsed
0.01 0.00 0.02
> system.time(datetime3 <- force_tz(datetime,"Europe/Paris"))
user system elapsed
5.94 0.02 5.98
identical(datetime2,datetime3)
[1] TRUE