将 lubridate 日期添加到矢量会更改时区,从而更改日期

Adding lubridate dates to vector changes timezone and thus date

在 R 包 lubridate 中,我可以使用以下语法轻松创建日期:

> mdy("5/4/2015")

正如预期的那样,它产生了以下结果:

[1] "2015-05-04 UTC"

但是,如果我尝试将那个值添加到数组中,它似乎从 UTC 更改为我的本地时间 (EDT):

> c(mdy("5/4/2015"))
[1] "2015-05-03 20:00:00 EDT"

因为我不关心时间,所以这不会对我产生太大影响,只是这会导致日期向后移动 1,如下所示:

> day(mdy("5/4/2015"))
[1] 4
> day(c(mdy("5/4/2015")))
[1] 3

对我来说,向数组添加一些东西的行为不应该改变那个东西的值。我在这里遗漏了什么吗?有没有办法解决这个问题?

那是因为 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

你可以这样做:

Sys.setenv(TZ = "UTC")

将您当地的时区设置为 UTC

或者,您可以在 mdy() 中明确指定时区:

mdy("5/4/2015", tz = "UTC")

除了 Steven 的解决方案,您还可以将日期存储在列表中

list(mdy("5/4/2015"))[[1]]
#[1] "2015-05-04 UTC"

这不会删除时区,您也不必弄乱环境变量。 我同意你的看法:如果你将 c 视为 "vector" 的某种形式的构造函数,并且你来自 C++ 或类似的背景,那么删除属性(名称除外)肯定好像很奇怪。