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

将lubridate日期添加到向量会更改时区,从而更改日期,r,date,lubridate,R,Date,Lubridate,在R包lubridate中,我可以使用以下语法轻松创建日期: > mdy("5/4/2015") 正如预期的那样,它会产生以下结果: [1] "2015-05-04 UTC" 但是,如果我尝试将该值添加到数组中,它似乎会从UTC更改为我的本地时间(EDT): 因为我不在乎时间,所以这不会对我产生太大影响,只会导致日期向后移动1,如下所示: > day(mdy("5/4/2015")) [1] 4 > day(c(mdy("5/4/2015"))) [1] 3 对我来说,向

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

> mdy("5/4/2015")
正如预期的那样,它会产生以下结果:

[1] "2015-05-04 UTC"
但是,如果我尝试将该值添加到数组中,它似乎会从UTC更改为我的本地时间(EDT):

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

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

对我来说,向数组中添加某个内容的行为不应该改变该内容的值。我是不是遗漏了什么,有没有办法解决这个问题?

这是因为
lubridate::mdy
假设
UTC
。当您将其环绕
c()
时,它会返回到您的本地时区
EDT
,因为
c()
不会传递
时区属性:

> 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()
中明确指定时区:


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

list(mdy("5/4/2015"))[[1]]
#[1] "2015-05-04 UTC"
这不会删除时区,也不必处理环境变量。
我同意你的看法:如果你把
c
看作是“向量”的某种形式的构造函数,并且你来自
c++
或类似的背景,那么删除属性(名称除外)肯定会显得很奇怪。

试试
Sys.setenv(TZ=“UTC”)
谢谢;这似乎修复了这个症状,我很欣赏,但我仍然对这样的想法感到不安,即我在向量中输入的值可能不是我从向量中提取的值。我不确定我是否对R的工作原理有一些基本的误解,或者这是否是lubridate中的一些怪癖。我想我仍然不清楚这有什么关系。从我的角度来看,如果我在数组中放入一个值,并立即向数组请求该值,它们最好是相同的。这类事情在R中常见吗?
mdy("5/4/2015", tz = "UTC")
list(mdy("5/4/2015"))[[1]]
#[1] "2015-05-04 UTC"