as.POSIXct,时区部分被忽略

时间:2020-04-14 22:33:00

标签: r posixct

这是我的例子。

test <- as.POSIXct(as.Date("2019-11-01"), tz = "UTC")
test

它打印:

[1] "2019-10-31 19:00:00 CDT"

它似乎忽略了tz参数:

attr(test, "tzone")

返回NULL。

为什么会有“ 19”小时而不是00小时?我怎样才能将其设为00小时并花费UTC

更新 这是更好的情况:

test_2 <- as.POSIXct("2019-11-01 00:00:00", tz = "UTC")
str(test_2)
attr(test_2, "tzone")
strftime(test_2, "%H")

它生成:

POSIXct[1:1], format: "2019-11-01"
[1] "UTC"
[1] "19"

现在看起来好像没有忽略参数tz,但是小时是19,但是为什么呢?

1 个答案:

答案 0 :(得分:1)

我们可以使用with_tz中的lubridate

library(lubridate)
test1 <- with_tz(as.Date("2019-11-01"), tzone = 'UTC')
attr(test1, 'tzone')
#[1] "UTC"

此外,as.POSIXct可以直接应用

test2 <- as.POSIXct("2019-11-01", tz = "UTC")
test2
#[1] "2019-11-01 UTC"
attr(test2, 'tzone')
#[1] "UTC"

通过strftime,将选项用于tz

strftime(test2, "%H", tz = 'UTC')
#[1] "00"

如果我们检查strftime,它将使用as.POSIXlt进行第二次转换,然后使用format获得格式化的输出

strftime
function (x, format = "", tz = "", usetz = FALSE, ...) 
format(as.POSIXlt(x, tz = tz), format = format, usetz = usetz, 
    ...)

根据?as.POSIXlt

tz-转换所使用的时区规范(如果需要)。特定于系统(请参阅时区),但是“”是当前时区,“ GMT”是UTC(世界标准时间,协调时间)。在某些带有警告的平台上,无效值通常被视为UTC。

as.POSIXlt(test2)$hour
#[1] 0
as.POSIXlt(test2, tz = "")$hour
#[1] 20

""默认使用Sys.timezone

as.POSIXlt(test2, tz = Sys.timezone())$hour
#[1] 20