【发布时间】:2018-03-12 08:10:59
【问题描述】:
我使用 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在午夜之后的转换日期的日期时间产生一个在午夜之前或之后一小时的日期时间。转换时间之前和之后的时间都是如此。
如果这不是错误,那肯定是意外行为。
【问题讨论】: