在 R 包 lubridate 中,我可以使用以下语法轻松创建日期:
> mdy("5/4/2015")
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它产生以下结果:
[1] "2015-05-04 UTC"
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试将该值添加到数组中,它似乎会从 UTC 更改为我的本地时间 (EDT):
> c(mdy("5/4/2015"))
[1] "2015-05-03 20:00:00 EDT"
Run Code Online (Sandbox Code Playgroud)
由于我不关心时间,这不会对我产生太大影响,只是这会导致日期向后移动 1,如下所示:
> day(mdy("5/4/2015"))
[1] 4
> day(c(mdy("5/4/2015")))
[1] 3
Run Code Online (Sandbox Code Playgroud)
对我来说,向数组添加一些东西的行为不应该改变那个东西的价值。我在这里遗漏了什么,有没有办法解决这个问题?
那是因为lubridate::mdy假设UTC. 当您将其环绕时c(),它会恢复到您的本地时区EDT,因为c()不传递该timezone属性:
> attr(mdy("5/4/2015", tz = "EDT"), "tzone")
# [1] "EDT"
> attr(c(mdy("5/4/2015", tz = "EDT")), "tzone")
# NULL
Run Code Online (Sandbox Code Playgroud)
你可以做:
Sys.setenv(TZ = "UTC")
Run Code Online (Sandbox Code Playgroud)
将您的本地时区设置为UTC.
或者,您可以在中明确指定时区mdy():
mdy("5/4/2015", tz = "UTC")
Run Code Online (Sandbox Code Playgroud)