lubridate ceiling_date 夏令时错误

lubridate ceiling_date bug with daylight savings

我使用 R 包 lubridate 来处理受夏令时影响的日期时间。例如,我的时区是 Australia/Adelaide,在 2017 年,时钟在 2017 年 4 月 2 日星期日 0300 向后拨一小时,在 2017 年 10 月 1 日星期日 0200 拨快一小时。

但是,函数 lubridate::ceiling_date 在夏令时方面表现异常。

假设我们有以下向量:

dt_1 <- lubridate::ymd("2017-10-01", tz = "Australia/Adelaide") %>%
    magrittr::add(lubridate::hours(c(0,1,23,24)))

dt_2 <- lubridate::ymd("2017-04-02", tz = "Australia/Adelaide") %>%
    magrittr::add(lubridate::hours(c(0,1,23,24)))

然后 lubridate::floor_date 按预期工作。

lubridate::floor_date(dt_1, unit = "days")
[1] "2017-10-01 ACST" "2017-10-01 ACST" "2017-10-01 ACST" "2017-10-02 ACDT"

lubridate::floor_date(dt_2, unit = "days")
[1] "2017-04-02 ACDT" "2017-04-02 ACDT" "2017-04-02 ACDT" "2017-04-03 ACST"

但是,lubridate::ceiling_date 生成的日期不是午夜。

lubridate::ceiling_date(dt_1, unit = "days")
[1] "2017-10-01 00:00:00 ACST" "2017-10-02 01:00:00 ACDT" "2017-10-02 01:00:00 ACDT" "2017-10-02 00:00:00 ACDT"

lubridate::ceiling_date(dt_2, unit = "days")
[1] "2017-04-02 00:00:00 ACDT" "2017-04-02 23:00:00 ACST" "2017-04-02 23:00:00 ACST" "2017-04-03 00:00:00 ACST"

如果这不是错误,那肯定是意外行为。

这个问题(由 https://github.com/tidyverse/lubridate/issues/605 的另一位用户单独报告)现已在 lubridate 1.7.3 中得到解决。