as.POSIXct,忽略时区部分

as.POSIXct, timezone part is ignored

这是我的例子。

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

它打印:

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

好像忽略了tz参数:

attr(test, "tzone")

returns 空。

为什么是“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,但是为什么?

我们可以使用 with_tzlubridate

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 - time zone specification to be used for the conversion, if one is required. System-specific (see time zones), but "" is the current time zone, and "GMT" is UTC (Universal Time, Coordinated). Invalid values are most commonly treated as UTC, on some platforms with a warning.

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

""默认使用Sys.timezone

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