diff --git a/r/R/dplyr-funcs-datetime.R b/r/R/dplyr-funcs-datetime.R index 0ff42944c0f..15a38997e7c 100644 --- a/r/R/dplyr-funcs-datetime.R +++ b/r/R/dplyr-funcs-datetime.R @@ -134,4 +134,9 @@ register_bindings_datetime <- function() { inherits(x, "POSIXct") || (inherits(x, "Expression") && x$type_id() %in% Type[c("TIMESTAMP")]) }) + + register_binding("leap_year", function(date) { + year <- Expression$create("year", date) + (year %% 4 == 0) & ((year %% 100 != 0) | (year %% 400 == 0)) + }) } diff --git a/r/tests/testthat/test-dplyr-funcs-datetime.R b/r/tests/testthat/test-dplyr-funcs-datetime.R index c3f79dc13ee..359a5403aca 100644 --- a/r/tests/testthat/test-dplyr-funcs-datetime.R +++ b/r/tests/testthat/test-dplyr-funcs-datetime.R @@ -634,3 +634,35 @@ test_that("extract yday from date", { test_df ) }) + +test_that("leap_year mirror lubridate", { + + compare_dplyr_binding( + .input %>% + mutate(x = leap_year(date)) %>% + collect(), + test_df + ) + + compare_dplyr_binding( + .input %>% + mutate(x = leap_year(datetime)) %>% + collect(), + test_df + ) + + compare_dplyr_binding( + .input %>% + mutate(x = leap_year(test_year)) %>% + collect(), + data.frame( + test_year = as.Date(c( + "1998-01-01", # not leap year + "1996-01-01", # leap year (divide by 4 rule) + "1900-01-01", # not leap year (divide by 100 rule) + "2000-01-01" # leap year (divide by 400 rule) + )) + ) + ) + +})