解析“yyyy-MM-dd'T'HH:mm:ssX”字符串时非常意外的行为(ISO 8601)
> as_datetime("2017-03-22T15:48:00.000Z")
[1] "2017-03-21 23:00:00 UTC"
> packageDescription("lubridate")$Version
[1] "1.6.0"
Run Code Online (Sandbox Code Playgroud)
有人可以解释这样做的理由吗?
编辑:似乎是一个错误,请参阅问题 #536
更新:在此处lubridate提交解决(2017 年 5 月)。适用于1.7.4,可能也适用于一些早期版本。lubridate
在不深入研究 的情况下as_datetime,我认为这可能是 (1)as_datetime
无法处理(即忽略)T您的格式的组合;(2)从本地到UTC时区的转换。
dstr <- "2017-03-22T15:48:00.000Z"
library(lubridate)
as_datetime(dstr)
## [1] "2017-03-22 04:00:00 UTC"
Run Code Online (Sandbox Code Playgroud)
如果as_datetime()忽略之后的所有内容T
,我们将在 2017-03-22 进入午夜。但是,这被视为我当地时区的午夜,即 GMT+04,因此结果时间为 04:00:00。大概您的当地时间是 GMT-01。
如果你手动替换一个空间让T事情更好地工作(stringr::str_replace如果你愿意,你可以使用
)
as_datetime(sub("T"," ",dstr))
## [1] "2017-03-22 19:48:00 UTC"
Run Code Online (Sandbox Code Playgroud)
或使用strptime:
strptime(dstr,format="%Y-%m-%dT%H:%M:%S")
## [1] "2017-03-22 15:48:00 EDT"
Run Code Online (Sandbox Code Playgroud)
(注意strptime自动丢弃尾随字符)
对于 Dirk Eddelbuettel 的anytime包处理这种情况的价值:
anytime(dstr)
## [1] "2017-03-22 15:48:00 EDT"
Run Code Online (Sandbox Code Playgroud)
如果您以此处提供的格式导入数据,并且想使用 lubridate 将其转换为日期时间对象,我建议您使用ymd_hmslubridate 函数。
在您的情况下,它看起来像这样:
ymd_hms("2017-03-22T15:48:00.000Z")
[1] "2017-03-22 15:48:00 UTC"
Run Code Online (Sandbox Code Playgroud)