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"
- 从每个输出向量的第一个元素开始,
ceiling_date
在转换日期的午夜是正确的(每个向量的第一个元素)。
- 从每个输出向量的第四个元素开始,
ceiling_date
在转换日期后的午夜是正确的(每个向量的第四个元素)。
- 但是,根据每个向量的第二个和第三个元素,
ceiling_date
在午夜之后转换日期的日期时间产生午夜前后一小时的日期时间。对于转换时间之前和之后的时间都是如此。
如果这不是错误,那肯定是意外行为。
这个问题(由 https://github.com/tidyverse/lubridate/issues/605 的另一位用户单独报告)现已在 lubridate 1.7.3 中得到解决。
我使用 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"
- 从每个输出向量的第一个元素开始,
ceiling_date
在转换日期的午夜是正确的(每个向量的第一个元素)。 - 从每个输出向量的第四个元素开始,
ceiling_date
在转换日期后的午夜是正确的(每个向量的第四个元素)。 - 但是,根据每个向量的第二个和第三个元素,
ceiling_date
在午夜之后转换日期的日期时间产生午夜前后一小时的日期时间。对于转换时间之前和之后的时间都是如此。
如果这不是错误,那肯定是意外行为。
这个问题(由 https://github.com/tidyverse/lubridate/issues/605 的另一位用户单独报告)现已在 lubridate 1.7.3 中得到解决。