在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
对我来说,向数组添加内容的行为不应该改变那些东西的价值。我在这里遗漏了什么,有没有办法解决这个问题?
答案 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++
或类似的背景,删除属性(名称除外)当然看起来很奇怪。