我使用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
在午夜之后的转换日期的日期时间产生一个日期时间,即午夜之前或之后的一小时。在转换时间之前和之后的时间都是如此。如果这不是一个错误,那么它肯定是出乎意料的行为。
答案 0 :(得分:0)
此问题(由https://github.com/tidyverse/lubridate/issues/605的其他用户单独报告)现已从lubridate 1.7.3解决。