Lubridate round_date() 似乎在四舍五入到天时更改时区

Lubridate round_date() seems to change time zone when rounding to day

我正在尝试四舍五入(到当天)日期时间数据。数据如下所示:

> date[10:15]
[1] "2016-08-31 23:03:02 EDT" "2016-08-31 22:52:50 EDT"
[3] "2016-08-31 22:50:02 EDT" "2016-08-31 22:34:28 EDT"
[5] "2016-08-31 22:31:41 EDT" "2016-08-31 22:25:37 EDT"

问题是当我用lubridate函数round_date()把日期"round"变成只有年月日部分的时候,日期好像改成了UTC (注意:UTC 比 EDT 提前约 5 小时,所以 00:40:17 EDT05:40:17 UTC,如果我理解正确的话):

> date_r
[1] "2016-09-01 EDT" "2016-09-01 EDT" "2016-09-01 EDT"
[4] "2016-09-01 EDT" "2016-09-01 EDT" "2016-09-01 EDT"

这是一个代表:

structure(c(1472698982, 1472698370, 1472698202, 1472697268, 1472697101, 
1472696737), class = c("POSIXct", "POSIXt"), tzone = "America/Detroit")

date_r <- round_date(date, unit = "day")

如果日期在美国东部时间包含 8-31,我试图将四舍五入的日期设为 8-31(而不是 9-1)。四舍五入时如何保留时区?对非 Lubridate 答案开放。

您可以在基数 R

中使用 strptime
d = structure(c(1472698982, 1472698370, 1472698202, 1472697268, 1472697101, 
     1472696737), class = c("POSIXct", "POSIXt"), tzone = "America/Detroit")

strptime(d, format = "%Y-%m-%d", tz = "America/Detroit")
#OR
#strptime(d, format = "%Y-%m-%d", tz = attr(d, "tzone"))
#[1] "2016-08-31 EDT" "2016-08-31 EDT" "2016-08-31 EDT"
#[4] "2016-08-31 EDT" "2016-08-31 EDT" "2016-08-31 EDT"

或使用 floor_datelubridate

library(lubridate)
floor_date(d, unit = "day")
#[1] "2016-08-31 EDT" "2016-08-31 EDT" "2016-08-31 EDT"
#[4] "2016-08-31 EDT" "2016-08-31 EDT" "2016-08-31 EDT"