将 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++
或类似的背景,那么删除属性(名称除外)肯定好像很奇怪。
在 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++
或类似的背景,那么删除属性(名称除外)肯定好像很奇怪。