向矢量添加润滑日期会更改时区,从而更改日期

时间:2015-05-05 01:43:34

标签: r date lubridate

在R package 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

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

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

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

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

这不会删除时区,你不必乱用环境变量。 我同意你的观点:如果你将c视为" vector"的某种形式的构造函数。而你来自C++或类似的背景,删除属性(名称除外)当然看起来很奇怪。