具有夏令时的lubridate ceiling_date错误

时间:2018-01-06 06:55:39

标签: r lubridate

我使用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在午夜之后的转换日期的日期时间产生一个日期时间,即午夜之前或之后的一小时。在转换时间之前和之后的时间都是如此。

如果这不是一个错误,那么它肯定是出乎意料的行为。

1 个答案:

答案 0 :(得分:0)

此问题(由https://github.com/tidyverse/lubridate/issues/605的其他用户单独报告)现已从lubridate 1.7.3解决。