在 R 中,as.POSIXlt 和 strptime 需要不同的格式吗?

In R, do as.POSIXlt and strptime require different formats?

考虑以下 R 控制台输出。

> Sys.getlocale()
[1] "LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_US.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C"
> dh <- '2018-05-08 07:42:34 PM'
> as.POSIXlt(dh,'%Y-%m-%d %I:%M:%S %p')
[1] "2018-05-08 07:42:34"
> strptime(dh,'%Y-%m-%d %I:%M:%S %p')
[1] "2018-05-08 19:42:34 -03"

如果两种格式相同,为什么 as.POSIXlt 无法正确识别 12 小时格式? dh 给出了晚上(晚上 7 点)的时间,但函数返回的是早上的时间! as.POSIXct 给出同样的错误。

我在这里错过了什么?

实际错误似乎在行中;

as.POSIXlt(dh, '%Y-%m-%d %I:%M:%S %p')

应该是:

as.POSIXlt(dh, format= '%Y-%m-%d %I:%M:%S %p')
#[1] "2018-05-08 19:42:34 BST"

strptime 的第二个参数是 format。因此,strptime(dh,'%Y-%m-%d %I:%M:%S %p') 工作正常,因为它将第二个参数视为 format

但是 as.POSIXlt 的第二个参数是 tz。因此,提供的被视为 format 的文本被视为 tz 并使用默认值 format。这导致了意想不到的价值。